이제 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를 입력해주면 될 것 같습니다.

 

이렇게 풀기는 했습니다... 와 어셈블리 디게 헷갈리네요...

+ Recent posts