난 정말 최고야 멋있어
CTFLearn - Jumper 본문
IA32를 알고있는지 물어보는 문제
근데 어셈블리가 AT&T 방식이라 조금 보기 힘들었다;;
buffer = ebp-10 count = ebp -c 0804848f : 804848f: 55 push %ebp 8048490: 89 e5 mov %esp,%ebp 8048492: 83 ec 18 sub $0x18,%esp 8048495: c7 45 f0 00 00 00 00 movl $0x0,buffer //printf 804849c: 83 ec 0c sub $0xc,%esp 804849f: 68 70 85 04 08 push $0x8048570 80484a4: e8 87 fe ff ff call 8048330 <printf@plt> 80484a9: 83 c4 10 add $0x10,%esp //4개의 인자 정리 80484ac: a1 20 a0 04 08 mov 0x804a020,%eax //fgets 80484b1: 83 ec 04 sub $0x4,%esp 80484b4: 50 push %eax 80484b5: 6a 04 push $0x4 //int num =4 80484b7: 8d 45 f0 lea buffer,%eax 80484ba: 50 push %eax //char*str = ebp-10 80484bb: e8 80 fe ff ff call 8048340 <fgets@plt> 80484c0: 83 c4 10 add $0x10,%esp //4개 인자 정리 80484c3: c7 45 f4 00 00 00 00 movl $0x0,count 80484ca: eb 0d jmp 80484d9 <jump+0x4a> < jump+0x3d>: 80484cc: 8b 45 f0 mov buffer,%eax 80484cf: 83 c0 05 add $0x5,%eax 80484d2: 89 45 f0 mov %eax,buffer 80484d5: 83 45 f4 01 addl $0x1,count <jump+0x4a>: 80484d9: 83 7d f4 07 cmpl $0x7,count 80484dd: 7e ed jle 80484cc <jump+0x3d> 80484df: 8b 45 f0 mov buffer,%eax 80484e2: ff d0 call *%eax <--- What address does this jump to?? 80484e4: 90 nop 80484e5: c9 leave 80484e6: c3 ret 80484e7: 66 90 xchg %ax,%ax 80484e9: 66 90 xchg %ax,%ax 80484eb: 66 90 xchg %ax,%ax 80484ed: 66 90 xchg %ax,%ax 80484ef: 90 nop |
요기는 나만의 작은 핸드레이
void jump() { char* buffer = null; mem_804A020 = printf(어쩌고 저쩌고); fgets( buffer , 4 , mem_804A020 ); for(int count=0 ; count <= 7 ; count++) { *buffer +=5; } *(buffer)(); return; }
|
주의해야 할 점이 있다면...
fgets 의 두번째 인자의 4는 마지막 널문자열까지 포함한 4글자로 사실상 3글자까지 밖에 입력을 받지 못한다
이때 문제에서 입력값으로 jump를 준다고 했으므로 fgets 호출 이후 스택의 모양을 생각해보면
ebp-10: 0x6a (j) |
ebp-f: 0x75 (u) |
ebp-e: 0x6a (m) |
ebp-d: 0x00(\0) |
[ebp-10] = 0x006A756A (인텔CPU => 리틀 엔디안)
count 가 0부터 7까지 총 8번 반복하므로 40 = 0x28
0x006A756A + 0x28 = 0x006D7592
따라서 플래그는 0x6D7592이 된다