CTF/포너블

[n00bzCTF] Pwn1 - 포너블 / 버퍼오버플로우 / IDA / Pwndbg / Pwntool

SecurityMan 2023. 6. 27. 11:00

 

쉬운 난이도의 포너블 문제

 

간단한 버퍼 오버플로우 문제이다.

 

반응형

 

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 로 내용을 읽어주면

 

플래그를 찾을 수 있다.

반응형