PWN题[强网先锋]no_output
知識點
strcpy(dest, src)
strcpy 函數(shù)用于將指定長度的字符串復制到字符數(shù)組里
語法形式為:char *strcpy(char *dest, const char *src, int n),
表示把src所指向的字符串里以src地址開始的前n個字節(jié)復制到dest所指的數(shù)組里,并返回被復制后的dest。
strcpy:strcpy只用于字符串復制,并且它不僅復制字符串內(nèi)容之外,還會復制字符串的結束符
例:strcpy(a,b) b為源字符串,a為復制b的字符串
read(unk_804C080, src, 0x10u):
unk_804C080的值被賦值為real_flag.txt里的內(nèi)容
因為
result = open(“real_flag.txt”, 1);
unk_804C080 = result;
類型sighandler_t,表示指向返回值為void型(參數(shù)為int型)的函數(shù)(的)指針。它用來聲明一個或多個函數(shù)指針。
sighandler_t sig1, sig2; 這個聲明等價于下面的寫法:
void (*sig1)(int), (*sig2)(int);
if ( v1 )
{
signal(8, (__sighandler_t)sub_8049236);
v2[1] = v2[0] / (int)v1;
result = signal(8, 0);
}
C語言里的信號signal():
信號是程序執(zhí)行過程里出現(xiàn)的異常情況。它可能是由程序里的錯誤造成的,例如引用內(nèi)存里的一個非法地址;或者是由程序數(shù)據(jù)里的錯誤造成的,例如浮點數(shù)被0除;或者是由外部事件引發(fā)的,例如用戶按了Ctrl+Break鍵。
signal()的原型為:
#include <signal.h>
void(*signal(int hum,void(*func)(int)))(int);
這恐怕是你在C標準函數(shù)庫里能見到的最復雜的說明了。如果你先定義一個typedef,理解起來就容易一些了。下面給出的sigHandler_t類型是指向一個程序的指針,該函數(shù)有一個int類型的參數(shù),并且返回一個void類型:
typedef void(*sigHandler_t)(int);
sigHandler_t signal(int num , sigHandler_t func);
解題流程
首先先查看保護機制
在終端輸入checksec ./test
IDA32位打開:
偽碼:
main:
點擊sub_8049424():
0x30=48
0x20=32
0x10=16
下面查看main的子程序:
(1)
result = open(“real_flag.txt”, 1); 對real_flag.txt文件只讀
result被賦值為從real_flag.txt文件的內(nèi)容
(2)
sub_80493EC(src);
點開sub_80493EC():
(3)
sub_8049385(src, off_804C034)
src為由read(unk_804C080, src, 0x10u)獲取到的flag內(nèi)容
因為read(unk_804C080, src, 0x10u)將unk_804C080值讀取0x10字節(jié)到src里
點開sub_8049385()
(3)
if ( !result )
result = sub_8049269();
點開sub_8049269()
漏洞分析
在這里,標準輸入會跟打開的文件里面的字符串進行比較,比較成功才會進入下一步
但是我們發(fā)現(xiàn)上面用了一個strcpy函數(shù),strcpy存在單字節(jié)的溢出,這個函數(shù)會用’\x00’結尾,我們可以在上面讓dest的后面一個字節(jié)為’\x00’,以覆蓋fd,改為0后可以直接從stdin讀入內(nèi)容,從而通過strcmp的檢測。
繞開比較進入函數(shù)之后是一個signal,必須觸發(fā)這個signal 8號信號才能進入最后的函數(shù)。
signal8是浮點例外。在發(fā)生致命的算術運算錯誤時發(fā)出. 不僅包括浮點運算錯誤, 還包括溢出及除數(shù)為0等其它所有的算術的錯誤。
解決方案
不能除0,就構造溢出。
需要觸發(fā)算數(shù)異常SIGFPE,可以通過-0x80000000/-1觸發(fā),觸發(fā)后可以直接執(zhí)行一個棧溢出;由于程序里沒有輸出函數(shù),無法leak函數(shù),所以使用ret2dlresolve方法直接getshell
exp
flag值為:qwb{n0_1nput_1s_great!!!}
總結
以上是生活随笔為你收集整理的PWN题[强网先锋]no_output的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 #include <> 与 #i
- 下一篇: BugkuCTF-Reverse题mob