이제 18번입니다!
이 문제도... 3개만 남았네여..
시작합시다!
코드는 이렇습니다.
이상한 함수가 많네요...
FD_ZERO: 두번째 인자의 모든 비트를 지웁니다.
FD_SET: 첫번째 인자에 해당하는 비트를 1로 합니다.
FD_CLR: 두번째 인자 중 첫번째 인자에 해당하는 비트를 0으로 합니다.
FD_ISSET: 두번째 인자 중 첫번째 인자에 해당하는 비트가 세트되어 있으면 양수값은 첫번째 인자를 리턴합니다.
함수를 안보고 풀었지만, 정리할 때는 필요할 것 같아서 적어봤습니다.
코드를 보면 대충 read 함수에서 stdin으로 입력을 받고 입력받은 값에 따라서 switch문이 작동되는 것 같습니다.
변수 선언을 해 줄때 string check x count 순으로 진행됩니다.
그리고 만약 check가 0xdeadbeef라면 쉘을 실행하네요...
코드를 보면
switch 부분에서 case에 없으면, 그 값을 string[count]에 집어넣는다고 합니다. 이걸 이용하면 어떤 위치던지 데이터를 집어넣을 수 있을 것 같습니다.
우선 x가 우리가 입력받는 부분이고, string[count] = x 는 우리가 데이터를 마음데로 집어넣게 해주는 그런 부분입니다.
또한 shell을 실행할 수 있도록 해주는 if 문에는 check를 통해 검사를 하므로 string[count]를 통해 check를 바꿔야겠네요.
코드가 길어 gdb로 모두 하기엔 너무 많으므로 일단 여기까지만 보겠습니다. 대충 shell코드를 실행하기 위한 if문 부분까지인가 보네요.
변수 메모리는 모두 256바이트로 할당되어있습니다.
string[1]*100 + check[4] + x[4] + count[4] = 112이므로 나머지는 144바이트가 있는데요... 위치를 확인해봅시다.
check는 if문에서 사용하니까 그 부분을 보면...
이부분인거 같습니다. ebp-104부터 4바이트...
string[count]부분은 switch 내에 있으므로 그 부분을 보면...
대충 이부분인거같은데, cmp 개수를 통해서 switch를 구분해보면?
4번째 cmp부분일 테니까...
여기부터 어딘가까지인 것 같습니다...
x의 위치는 cmp를 통해서 ebp-252부터 4바이트 부분인 것을 알 수 있었네요.
아 참고로 je는 두 값이 같을 때 이동하는 것이고, jmp는 조건 없이 이동하는 것입니다.
이러면 저기부터 어딘가까지가 아니라 다시 찾아야겠네요...
찾아보니... 잘 이해는 못하겠지만 대충 저부분이 default 부분이고 while문의 끝이 되는 것 같습니다.
이부분을 보니 ebp-100의 주소를 eax에 넣고 eax를 ebp-252에 넣는다는 것 같습니다.
계속 찾아보죠
어셈블리에 익숙하지 않다보니까 자꾸 찾아보게 되는데
변수++ 변수-- 명령어가 어셈블리에서는 dec, inc로 구현되네요. 이를 이용하면 정말 빠르게 찾을 수 있을 것 같습니다.
우선 count++ 위에 string[count]가 존재하므로 count++를 찾아보도록 하죠!
대에충 이정도 부분인거 같습니다. count변수는 ebp-112부터 4바이트를 가지고 있다는 것도 알 수 있었네요.
ebp-100의 주소를 eax에 저장하는 것으로 보아하니... 저부분이 string 부분이 아닐까 하는 조심스러운 생각도 드네요.
일단 여기까지 알아낸 모든 변수의 위치를 적어봅시다... 기억이 안나요 ㅠㅜ
- check: ebp-104부터 4바이트
- count: ebp-112부터 4바이트
- x: ebp-252부터 4바이트
이렇게 3개를 알아냈습니다.
위의 사진을 천천이 알아보면...
다시
ebp-100의 주소를 eax에 입력
eax(ebp-100의 주소)를 ebp-252(x)에 4바이트 단위로 입력
ebp-112(count)의 값을 4바이트 단위로 edx에 입력
ebp-253의 값을 바이트 단위로 al에 입력
ebp-252(eax, ebp-100의 주소)의 값을 4바이트 단위로 ecx에 입력
al의 값을 바이트 단위로 edx+ecx(string의 해당 값의 주소)에 입력
이렇게 진행된 것 같습니다.
두번째 줄이 이해는 안가는데... 흐음...
암튼 ebp-100이 string[100]이랍니다.
이게 check랑 떨어져있는 거리가 4만큼이네요... check가 좀 더 앞에 있는거구요...
으아아아... 어셈블리 점점 헷갈리네요... 암튼 앞에 있는건 맞는거같으니까 저 차이만큼 \x08을 입력해주고 0xdeadbeef를 입력해주면 될 것 같습니다.
이렇게 풀기는 했습니다... 와 어셈블리 디게 헷갈리네요...
'Hacking-기초 > [PWN] FTZ' 카테고리의 다른 글
Free Training Zone (17) level17 → level18 (0) | 2020.07.23 |
---|---|
Free Training Zone (16) level16 → level17 (0) | 2020.07.23 |
Free Training Zone (15) level15 → level16 (0) | 2020.07.23 |
Free Training Zone (14) level14 → level15 (0) | 2020.07.22 |
Free Training Zone (13) level13 → level14 (0) | 2020.07.21 |