쉬운 난이도의 포너블 문제
간단한 버퍼 오버플로우 문제이다.
pwn1 바이너리 파일과 원격 접속 주소가 주어진다.
한번 nc 를 이용해 원격으로 접속해 봤다.
Would you like a flag? 라는 문장이 출력되고
사용자 입력을 받는다.
아무렇게나 입력해보니
fake flag 가 출력되었다.
IDA 라는 디스어셈블러를 이용해 main 함수를 살펴보았다.
여기서 확인할 수 있는 문제는
배열 s 의 크기가 64 인데
fgets 함수로 80 만큼 입력을 받고 있는 것이다.
선언한 길이보다 더 많은 입력을 받아 버퍼오버플로우 취약점이 발생한다.
버퍼오버플로우를 통해 ret 주소를 변경시켜야 한다.
변경시킬 대상 주소는
코드 어디에서도 호출하지 않고 있는 win() 함수이다.
win 함수는 system("/bin/sh") 를 실행시키기 때문에
운영체제 명령어를 실행시킬 수 있다.
pwndbg를 이용해 바이너리를 분석해준다.
info func 명령어로
win 함수의 주소를 확인한다.
0x000000000040124a
이제 b main 으로
main 함수에 브레이크 포인트를 걸고
r 을 입력해 실행시켜 준다.
ni 를 입력해 바이너리를 한단계씩 실행시키면서
fgets 함수까지 간다.
fgets 함수가 실행되면 사용자 입력을 받는데
그때 aaaa 라고 입력해본다.
다음으로 bt 를 입력해
현재 진행상태에서 어디로 리턴하는지 확인한다.
정상적으로 바이너리가 실행된다면 0x00007ffff7df218a 로 리턴이 되어야 한다.
다음으로 x/100wx $rsp 를 입력해 스택을 확인해본다.
아까 입력한 aaaa(0x61616161) 가 맨 앞에 들어가 있고,
ret 주소인 0x00007ffff7df218a 가 중간쯤에 보인다.
aaaa와 ret 주소 사이의 크기를 구하면 72 인것을 알 수 있다.
from pwn import *
r = remote("challs.n00bzunit3d.xyz", 35932)
r.sendline(b"a"*72 + p64(0x000000000040124a))
r.interactive()
python 의 pwntool 을 이용해
이렇게 코드를 작성할 수 있다.
a 를 72개 채우고,
그다음 win() 의 주소인 0x000000000040124a 로 ret 주소를 덮어쓰는것이다.
코드를 실행시키면
system('/bin/sh') 가 실행되어
쉘이 떨어지고
ls 명령어로 flag.txt 파일을 확인,
cat flag.txt 로 내용을 읽어주면
플래그를 찾을 수 있다.
'CTF > 포너블' 카테고리의 다른 글
[n00bzCTF] Flag Shop - 포너블 (68) | 2023.06.23 |
---|---|
[Tenable CTF] One Byte at a Time - 포너블 / XOR (48) | 2023.03.18 |
[justCTF] MyLittlePwny - 포너블 / Jail Escape (76) | 2023.02.13 |
[2020CCE] Simple Pwn - 포너블 / 버퍼오버플로우 / Pwndbg / Pwntool / IDA (60) | 2022.11.08 |
[2020CCE] Simple Cmdshell / Simple Patch - 포너블 / IDA (66) | 2022.10.24 |