WARGAME/pwnable.kr

pwnable.kr passcode write-up

msh1307 2022. 8. 16. 23:37

접속해서 코드를 읽어봤다.

바이너리를 실행시켜보면, segmentation fault가 난다.

 

문제에서

compiler warning이 떴는데 무시했다고 한다.

 

그래서 로컬에 하나 만들어서 컴파일 해보았다.

보면 &가 빠져있다.

주소를 쓰는 게 아니라 값을 주소처럼 써버려서 segmentation fault가 나는 것 같다.

만약 이때 passcode1의 값을 변조할 수 있다면, 임의 주소에 마음대로 쓸 수 있다.

PIE가 걸려있지 않고 Partial RELRO가 걸려있다.

카나리가 있으니 welcome 함수에서 bof를 터뜨려서 ret를 변조하는 것을 힘들어 보인다.

base가 고정이라서 원하는 곳으로 eip를 변조하기 수월하고, Partial RELRO가 걸려있으니 got를 덮는 것을 고려해볼 수 있다.

 

gdb로 passcode를 열어본다.

login의 disassembly다.

scanf의 인자로 stack에 push 되는 것들을 살펴보면, 

login + 31 부분에 ebp-0x10의 값을 DWORD로 참조해서 넣는 것을 볼 수 있다.

ebp-0x10이 소스 코드에서 passcode1에 해당한다.

welcome의 disassembly다.

welcome + 58 부분을 보면, ebp-0x70을 printf로 출력해주는 것을 볼 수 있다.

ebp-0x70은 welcome + 38 부분의 scanf의 파라미터로도 들어간다.

ebp-0x70은 소스코드에서 name에 해당한다.

bp를 걸고, 돌려보면서 주소를 확인해보면 된다.

버퍼 시작 주소가 0xff864618이고 아까 passcode1이 0xff864678에 위치해있다.

둘 사이의 거리를 구하면, decimal로 96이 나온다.

 

welcome 함수에서 scanf가 100바이트만 받으니 딱 4바이트인 passcode1을 덮을 수 있다.

passcode1을 exit의 got로 덮고, passcode1을 입력할 때 

0x080485e3을 입력해주면, eip를 옮길 수 있다.

passcode1을 scanf로 받을 때 포맷 스트링이 %d라서 %d에 맞게 넣어줘야 한다.

134514147이 된다.

 

'WARGAME > pwnable.kr' 카테고리의 다른 글

pwnable.kr random write-up  (0) 2022.08.20
pwnable.kr flag write-up  (0) 2022.08.15
pwnable.kr bof write-up  (0) 2022.08.15
pwnable.kr collision write-up  (0) 2022.08.15
pwnable.kr fd write-up  (0) 2022.08.14