为什么堆栈中的这个字符串不完全是我输入的字符串?

逆向工程 拆卸 数据库 缓冲区溢出
2021-06-28 06:18:50

我试图使用以下 C 程序来理解缓冲区溢出攻击

#include"stdio.h"  
#include"string.h"   
void iwontprint()  
{  
    printf("i wont be printed!");  
}  

void callme()  
{  
    char buffer[8];  
    gets(buffer);  
    puts(buffer);  
}  

int main(int argc,int** argv)  
{  
    callme();  
    return 0;  
}

在调用gets(buffer)ESP之前在 GDB 中加载程序给出以下值:

0xbffff4d4: 0xb7ff0590 0x080484db 0xb7fc1ff4 0xbffff4e8  
0xbffff4e4: 0x080484b6 0xbffff568 0xb7e79e46 0x00000001

输入输入后,123456789abc\x7c\x84\x04\x08我在 ESP 中得到完全不同的值:

0xbffff4d4: 0xbffff4d8 0x34333231 0x38373635 0x63626139  
0xbffff4e4: 0x6337785c 0x3438785c 0x3430785c 0x3830785c

我已经设置了 randomize_va_space = 0

$cat /proc/sys/kernel/randomize_va_space   
0

任何人都可以提供有关我在这里缺少什么的任何指示吗?

2个回答

你的堆栈完全没问题。仔细查看这些值:

0x34333231 0x38373635 0x63626139 0x6337785c 0x3438785c 0x3430785c 0x3830785c

被解释为 ascii 字符串的就变成了这个。字面上地:

123456789abc\x7c\x84\x04\x08

如您所见,这正是您输入的内容。我的意思是,例如,它\x7c是 String"\x7c"而不是"|"使用此技术正确发送值:

echo -e "123456789abc\x7c\x84\x04\x08" | ./yourbinary

Samurai 的答案是正确的,但更清楚地说,您的错误是您输入了文字字符串

123456789abc\x7c\x84\x04\x08

你可能想要的东西是这样的:

perl -e 'print "123456789abc\x7c\x84\x04\x08"' | ./yourbinary

在第一种情况下,\x7c\x84\x04\x08就是一个 16 个字符长度的字符串,而在第二种情况下,\x转义序列实际上被解释并\x7c\x84\x04\x08打印为仅 4 个字节。