中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

浙江網(wǎng)站建設網(wǎng)站優(yōu)化泉州seo外包

浙江網(wǎng)站建設網(wǎng)站優(yōu)化,泉州seo外包,邢臺疫情最新規(guī)定,彩票網(wǎng)站如何做推廣目錄 前言 命令行參數(shù) 16進制轉字符串 extract_message1 process_keys12 extract_message2 main process_keys34 前言 因為這個學期基本都在搞CTF的web方向,C語言不免荒廢。所幸還會一點指針相關的知識,故第一個安全項目做的挺順利的&#xff0c…

目錄

前言

?命令行參數(shù)

16進制轉字符串

extract_message1

process_keys12

extract_message2

main

process_keys34


前言

因為這個學期基本都在搞CTF的web方向,C語言不免荒廢。所幸還會一點指針相關的知識,故第一個安全項目做的挺順利的,也把思維切換切換,接觸點新東西。

貼出源碼

#include <stdio.h>
#include <stdlib.h>int prologue[] = {0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F,0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69,0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72,0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72,0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966,0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F,0x20206F74, 0x74786565, 0x65617276, 0x32727463,0x594E2020, 0x206F776F, 0x79727574, 0x4563200A
};int data[] = {0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72,0x466D203A, 0x65693A72, 0x43646E20, 0x6F54540A,0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F,0x594E2020, 0x206F776F, 0x79727574, 0x4563200A,0x6F786F68, 0x6E696373, 0x6C206765, 0x796C656B,0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966,0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F,0x20206F74, 0x74786565, 0x65617276, 0x32727463,0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69,0x21687467, 0x63002065, 0x6C6C7861, 0x78742078,0x6578206F, 0x72747878, 0x78636178, 0x00783174
};int epilogue[] = {0x594E2020, 0x206F776F, 0x79727574, 0x4563200A,0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69,0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F,0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966,0x20206F74, 0x74786565, 0x65617276, 0x32727463
};char message[100];void usage_and_exit(char* program_name) {fprintf(stderr, "USAGE: %s key1 key2 key3 key4\n", program_name);exit(1);
}void process_keys12(int* key1, int* key2) {*((int*)(key1 + *key1)) = *key2;
}void process_keys34(int* key3, int* key4) {*(((int*)&key3) + *key3) += *key4;
}char* extract_message1(int start, int stride) {int i, j, k;int done = 0;for (i = 0, j = start + 1; !done; j++) {				for (k = 1; k < stride; k++, j++, i++) {if (*(((char*)data) + j) == '\0') {done = 1;break;}message[i] = *(((char*)data) + j);}}message[i] = '\0';return message;
}char* extract_message2(int start, int stride) {     int i, j;for (i = 0, j = start;*(((char*)data) + j) != '\0';i++, j += stride){message[i] = *(((char*)data) + j);}message[i] = '\0';return message;
}int main(int argc, char* argv[])
{int dummy = 1;int start, stride;int key1, key2, key3, key4;char* msg1, * msg2;key3 = key4 = 0;if (argc < 3) {usage_and_exit(argv[0]);}key1 = strtol(argv[1], NULL, 0);key2 = strtol(argv[2], NULL, 0);if (argc > 3) key3 = strtol(argv[3], NULL, 0);if (argc > 4) key4 = strtol(argv[4], NULL, 0);process_keys12(&key1, &key2);start = (int)(*(((char*)&dummy)));      stride = (int)(*(((char*)&dummy) + 1));	     if (key3 != 0 && key4 != 0) {process_keys34(&key3, &key4);}msg1 = extract_message1(start, stride);if (*msg1 == '\0') {process_keys34(&key3, &key4);msg2 = extract_message2(start, stride);printf("%s\n", msg2);}else {printf("%s\n", msg1);}return 0;
}

?命令行參數(shù)

在C語言程序中,主函數(shù)main()可以有兩個參數(shù),用于接收命令行參數(shù)。帶有參數(shù)的函數(shù)main()習慣上書寫為:

(頗有pearcmd的感覺哈哈哈)

int main(int argc,char *argv[])
{
...
}

argc和argv是函數(shù)main()的形參(argc和argv分別是argument count和argument vector的縮寫)。用命令行的方式運行程序時,函數(shù)main()被調用,與命令行有關的信息作為實參傳遞給兩個形參。

第一個參數(shù)argc接收命令行參數(shù)(包括命令)的個數(shù);第二個參數(shù)argv接受以字符串常量形式存放的命令行參數(shù)(包括命令本身也作為一個參數(shù))。字符指針數(shù)組argv[]表示各個命令行參數(shù)(包括命令),其中argv[0]指向命令,argv[1]指向第1個命令行參數(shù),argv[2]指向第2個命令行參數(shù)......argv[argc-1]指向最后一個命令行參數(shù)。

審一下源碼的這部分

其實就是讓我們最少傳2個參數(shù)(第0個參數(shù)為程序名),否則就會exit

16進制轉字符串

這里顯然只有data數(shù)組有用,只需要轉換data數(shù)組即可

如果直接用16進制轉字符串的網(wǎng)站,會發(fā)現(xiàn)轉換結果并不正確

于是跟著代碼邏輯自己寫一版16進制逐字節(jié)解碼程序

#include <stdio.h>int data[] = {0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72,0x466D203A, 0x65693A72, 0x43646E20, 0x6F54540A,0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F,0x594E2020, 0x206F776F, 0x79727574, 0x4563200A,0x6F786F68, 0x6E696373, 0x6C206765, 0x796C656B,0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966,0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F,0x20206F74, 0x74786565, 0x65617276, 0x32727463,0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69,0x21687467, 0x63002065, 0x6C6C7861, 0x78742078,0x6578206F, 0x72747878, 0x78636178, 0x00783174};void decode1(int* data){for (int i = 0; ; i++) {char c = *(((char*)data) + i);putchar(c);if (c == '\0') break;}}int main(){decode1(data);return 0;}

運行結果

兩者的差異是什么原因呢?

因為Intel處理器是小端,所以數(shù)組里每個int的低位存儲在內存的低地址處,即先被轉化

例如

int 0x5A33723479(Z3r4y)

在內存中:

79 34 72 33 5A(y4r3Z)

所以我們把data的數(shù)據(jù)先預處理一下再放入16進制轉字符串在線網(wǎng)站即可(雖然沒有必要)

接下來看一些關鍵代碼

extract_message1

傳入一個start和stride,將data數(shù)組轉換成字符串

這個函數(shù)的功能是,從 data 數(shù)組的首地址偏移 start + 1 地址開始,每轉換 stride -1 個字符后,就跳過一個字符不轉換,重復執(zhí)行這樣的操作直到轉換到最后一個字符

已知明文最開始為:From: ,可利用其來倒推出start和stride

這里顯然是從第10個字符開始(從0開始計數(shù)),每次轉換兩個字符,故start=9,stride=3

?再發(fā)現(xiàn)start和stride是由dummy得來的

將dummy最低的字節(jié)賦值給start(要等于9),將dummy第二低的字節(jié)賦值給stride(要等于3)

即dummy為0x????0309

記錄一下低2位轉10進制是777

process_keys12

?訪問以 key1 變量的地址為初始地址,偏移 *key1 的值×sizeof(int) 即4字節(jié)的地址,賦成*key2的值。

這里就可以操縱key1地址將其偏移到dummy的地址,再操縱*key2來控制dummy的值

調試看key1和dummy的地址

(左為key1,右為dummy)

計算地址差值

24?4=9 ,所以只要令*key1=9即可偏移到dummy的地址

再令*key2=777,使得dummy為0x00000309,成功使得start為9,stride為3

回顯正確

提示我們要選擇key3key4來調用extract2并且避免調用extract1

extract_message2

其實和extract_message1大同小異

從 data 數(shù)組的首地址偏移 start 地址開始,每讀入一個字符,就跳過stride-1個字符,直到轉換到最后一個字符

可見start=9,stride=3 (剛好就是msg1對應的數(shù)據(jù),故key1,key2傳的值不用改)

main

?通過代碼審計,發(fā)現(xiàn)只要讓extract_message1返回一個空字符串就可以打印出msg2

我們接著看,怎么操縱msg1='\0'

extract1 最初會訪問第10個字符(從0開始計數(shù)),而第10個字符恰好會在 extract2 (從第9個字符開始,每隔2個取一個)中被忽略不會影響答案。
所以我們可以直接嘗試改變 data 數(shù)組,使其表示的第10個字符為 \0 ,即將data[2]=0x72464663轉變成 0x72004663 。
可以借助 process_keys34 來操縱data[2]

process_keys34

?這個函數(shù)就是把指向key3指針的地址偏移*key3的值×sizeof(int)即4個字節(jié)的地址,將其解引用,自增一個*key4的值

那么我們就可以將指向key3指針的地址偏移到data[2]上,然后利用*key4改變data[2]的值,這里72004663-72464663=-4587520,key4傳入-4587520即可

調試觀察&key3和data[2]的地址

?2597600/4=649400

所以key3傳入649400

綜上,key1,key2,key3,key4分別傳入9 777 649400 -4587520

運行回顯正確

實驗1還是比較友好的,做的時候沒有太坐牢,對于一個C語言小白這種難度剛剛好QWQ

http://m.risenshineclean.com/news/61636.html

相關文章:

  • 怎么找回網(wǎng)站后臺密碼百度問答優(yōu)化
  • 江西南昌網(wǎng)站建設服務文大俠seo博客
  • 網(wǎng)站 功能建設上 不足搜索引擎優(yōu)化的作用是什么
  • 寧波建設網(wǎng)站哪家好北京自動網(wǎng)絡營銷推廣
  • 英國網(wǎng)站后綴百度刷搜索詞
  • 自己電腦做服務器搭建網(wǎng)站有域名百度小說排行榜風云榜單
  • 軟件技術的發(fā)展前景搜索引擎優(yōu)化是什么?
  • 1 建設網(wǎng)站目的是什么意思上海搜索排名優(yōu)化公司
  • 手機營銷網(wǎng)站模板怎樣建立一個網(wǎng)絡銷售平臺
  • 網(wǎng)站上線步驟 icp備案寧波pc營銷型網(wǎng)站制作
  • 木材加工公司網(wǎng)站建設廣告投放渠道
  • 高端網(wǎng)站建設公司哪家專業(yè)靠譜百度怎么打廣告
  • 做視頻網(wǎng)站空間要多大seo中國是什么
  • 怎么做娛樂網(wǎng)站保定百度首頁優(yōu)化
  • cloudflare wordpressseo網(wǎng)站免費優(yōu)化軟件
  • wordpress網(wǎng)站關閉網(wǎng)上宣傳廣告怎么做
  • 極速在線網(wǎng)站百度口碑網(wǎng)
  • 彩票類網(wǎng)站開發(fā)谷歌海外推廣怎么做
  • 做網(wǎng)站西寧肇慶網(wǎng)站推廣排名
  • 做資源網(wǎng)站需要什么軟件網(wǎng)站排名顧問
  • html5手機網(wǎng)站湖南長沙關鍵詞推廣電話
  • 如何自制作網(wǎng)站做網(wǎng)絡優(yōu)化的公司排名
  • 磁力天堂torrentkitty太原seo關鍵詞排名優(yōu)化
  • 網(wǎng)站建設與維護王欣品牌廣告和效果廣告的區(qū)別
  • 電腦怎樣做病毒網(wǎng)站軟文怎么寫吸引人
  • 深圳創(chuàng)建網(wǎng)站信息流優(yōu)化師是什么
  • 石家莊信息網(wǎng)官方網(wǎng)站免費訪問國外網(wǎng)站的app
  • 歐米茄女士手表網(wǎng)站國內搜索引擎有哪些
  • 網(wǎng)站開發(fā) 彈窗電腦培訓班速成班
  • 現(xiàn)在還有用dw做網(wǎng)站市場營銷案例分析