wargame/IO smash the stack

level1을 풀다가 생긴 의문점에 대한 분석

Sanguine 2014. 5. 12. 20:23

1. 메인함수에서 함수를 불러올때 인자를 주지않았는데 어떻게 함수가 정상실행 되는가?


2.YouWin함수는 어떻게 쉘을 실행시키는가


3.fscanf 역추적으로 풀기

fscanf가 어떤것인지는 알고 있었지만 레페런스를 찾아보지않고 처음에 풀려는 고집떄메, 역추적으로 문제를 풀었다.


0804809f <fscanf>:

 804809f:       81 ec 00 10 00 00       sub    $0x1000,%esp

 80480a5:       b8 03 00 00 00          mov    $0x3,%eax    //read 시스템콜

 80480aa:       bb 00 00 00 00          mov    $0x0,%ebx    // 0번 fd (stdin)

 80480af:       89 e1                   mov    %esp,%ecx

 80480b1:       ba 00 10 00 00          mov    $0x1000,%edx

 80480b6:       cd 80                   int    $0x80

 80480b8:       89 e6                   mov    %esp,%esi     //받은 값의 주소를 esi에

 80480ba:       31 db                   xor    %ebx,%ebx     //0으로 초기화

 

080480bc <skipwhite>:

 80480bc:       31 c0                   xor    %eax,%eax     //0으로 초기화

 80480be:       ac                      lods   %ds:(%esi),%al  //esi를 1바이트 esi가 가리키는 값을 al에 옮김

 80480bf:       3c 20                   cmp    $0x20,%al     //스페이스인지 검사

 80480c1:       74 f9                   je     80480bc <skipwhite>   //스페이스라면 다시 skipwhite

 

080480c3 <doit>:

 80480c3:       2c 30                   sub    $0x30,%al //

 80480c5:       3c 09                   cmp    $0x9,%al   //al이 0x9보다 크면

 80480c7:       77 0a                   ja     80480d3 <exitscanf>  //점프

 80480c9:       6b db 0a                imul   $0xa,%ebx,%ebx   //ebx * 0xa

 80480cc:       01 c3                   add    %eax,%ebx     // ebx = ebx + eax

 80480ce:       31 c0                   xor    %eax,%eax     //0으로 초기화

 80480d0:       ac                      lods   %ds:(%esi),%al //다음값

 80480d1:       eb f0                   jmp    80480c3 <doit> 

 

080480d3 <exitscanf>:

 80480d3:       89 d8                   mov    %ebx,%eax

 80480d5:       81 c4 00 10 00 00       add    $0x1000,%esp

 80480db:       c3                      ret

 

 

Summary:

거꾸로 따라가면 편하다.

 

hgvbmkQIHavkGg5wyk