level1을 풀다가 생긴 의문점에 대한 분석
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