우선 ssh로 접속하여 passcode.c의 내용을 확인하면 다음과 같다.
코드를 보면 passcode1, passcode2를 입력받는 부분이 있는데, 자세히 보면 &passcode가 아니고 &가 빠져있는 것을 볼 수 있다. 이는 passcode1, passcode2 변수에다가 우리가 입력한 값을 저장하겠다는 의미가 아니라 passcode1, passcode2가 있는 주소에다가 우리가 입력한 값을 넣겠다는 의미이다. 그래서 쓰레기값이 있는 주소에 우리가 입력한 값을 넣어 오류가 뜨게 된다.
우선 gdb로 함수들을 자세히 보자.
welcome 함수
name값을 ebp-0x70에 저장한다.
login 함수
passcode1은 ebp-0x10에 위치하는것을 알 수 있다.
0x70 - 0x10 = 0x60이므로 96바이트이다. 근데 name에서 입력을 100바이트 받기 때문에 이를 이용한다면 passcode1의 값은 우리가 원하는대로 조작할 수 있다.
그래서 우리는 fflush함수의 GOT에 system함수의 GOT를 덮어써서 공격을 할것이다.
1) fflush함수의 GOT를 알아본다.
login함수에서 fflush함수의 PLT를 확인하고
PLT를 자세히 확인한다.
PLT가 참조하는 부분이니까 결국 fflush의 GOT는 0x804a004임을 알 수 있다.
2) system("/bin/sh")의 시작 주소를 알아본다.
마찬가지로 login함수에서 system이 시작하는 주소를 찾고
해당 주소에 있는 문자열을 찍어봐서 주소를 확인한다.
따라서 system("/bin/sh")의 시작 주소는 0x080485e3임을 알 수 있다.
페이로드
NOP [96] + fflush의 GOT + system("/bin/sh")의 시작주소
(python -c 'print "\x90"*96+"\x04\xa0\x04\x08"+"134514147"')|./passcode
여기서 134514147로 입력하는 이유는 scanf에서 %d로 받기 때문에 0x080485e3을 10진수로 변환한 값을 입력해준다.
공격 성공!
'War Game > Pwn(pwnable.kr)' 카테고리의 다른 글
[Pwnable.kr] shellshock 문제풀이 (0) | 2019.12.05 |
---|---|
[Pwnable.kr] mistake 문제풀이 (0) | 2019.12.05 |
[Pwnable.kr] leg 문제풀이 (0) | 2019.12.02 |
[Pwnable.kr] Input 문제풀이 (0) | 2019.12.01 |