最近在學(xué)用DynELF + puts函數(shù)泄漏system地址從而getshell雄妥,遇到幾個坑
get函數(shù)溢出時不適合用DynELF泄漏
剛開始使用gets函數(shù)產(chǎn)生棧溢出的程序來泄漏文兢,但由于gets函數(shù)讀到\x0a即換行符的時候就會截斷,而leak函數(shù)的address又有些會帶有\(zhòng)x0a国夜,導(dǎo)致payload被截斷從而程序終止
程序成功執(zhí)行卻起不了shell
由于gets函數(shù)不適合用DynELF焚碌,所以用read函數(shù)改寫了個測試程序來利用DynELF佛吓,但能執(zhí)行system卻get不到shell
#測試程序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char buf2[100];
void secure(void)
{
int secretcode, input;
srand(time(NULL));
secretcode = rand();
scanf("%d", &input);
if(input == secretcode)
puts("no_shell_QQ");
}
void func(void)
{
char buf1[100];
printf("No surprise anymore, system disappeard QQ.\n");
printf("Can you find it !?");
return read(0, buf1, 160);
}
int main(void)
{
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 1, 0LL);
func();
return 0;
}
可以看到是能執(zhí)行system的蛇更,但是發(fā)現(xiàn)執(zhí)行到call execve沒有fork新進(jìn)程,然后我改了一下源碼,加一個system("/bin/sh")函數(shù)筋讨,來觀察有什么不同
我發(fā)現(xiàn)好像少了QT_QPA_PLATFORMTHEME=appmenu-qt5這個環(huán)境變量所以get不到shell,然后檢查一下payload看看哪里破壞了堆棧結(jié)構(gòu)導(dǎo)致環(huán)境變量被破壞
然后看網(wǎng)上別人leak函數(shù)的payload好像不用pop掉傳進(jìn)去的參數(shù)埃叭,然后我們改payload為
payload = 'a'*0x6c + 'bbbb' + p32(puts_plt) + p32(vulfun_addr) + p32(address)
再運(yùn)行也還是不行,但偶然之間又改了一下最后的payload
改成
竟然就能getshell了悉罕!赤屋,調(diào)了一下發(fā)現(xiàn)還是沒有環(huán)境變量,同時call execve也沒有產(chǎn)生新的進(jìn)程壁袄,但是當(dāng)執(zhí)行exit函數(shù)的sysenter時就會不知道做了什么就能getshell(十分神奇)
后面我也經(jīng)過大量調(diào)試+猜測类早,發(fā)現(xiàn)當(dāng)
有4個數(shù)量的參數(shù)時,執(zhí)行sysenter就能成功getshell...
具體的原理也沒搞懂(希望日后能知道為什么)嗜逻,有知道的師傅也可以告訴我...