gpt4 book ai didi

c - 请帮助我理解这个 main() 代码

转载 作者:行者123 更新时间:2023-11-30 18:53:58 25 4
gpt4 key购买 nike

请有人帮助我理解这里发生了什么。实际上是在主程序上。

#include <stdlib.h>

char shellcode[] = "\xbb\x14\x00\x00\x00", "\xb8\x01\x00\x00\x00","\xcd\x00";

int main()
{
int *ret
ret = (int *) &ret + 2;
(*ret) = (int)shellcode;
}

最佳答案

首先进行一些修复以使代码正常工作:

  • ; 附加到第 7 行以标记指令的结尾。
  • 删除第 3 行第一个字符串之后的其他字符串,因为该指令行需要分配给 char 变量。

此外,不需要 stdlib ,因为没有使用它,可以通过直接使用第 8 行中的结果和您的 来跳过对 ret 的分配shellcode 字符串可以缩短为 3 个字符,因为仅使用 4 个字节,而且 C 字符串无论如何都以终止字符结尾。

char shellcode[] = "\xbb\x14\x00";

int main()
{
int *ret;
*((int*)&ret + 2) = (int)shellcode;
}

使用 gcc -o test.o -c test.c 进行编译,以获取 x86 目标,并在汇编后输出(带有我的注释):

Disassembly of section .text:

00000000 <_main>: ; int main(){
0: 55 push %ebp ; save base pointer on stack
1: 89 e5 mov %esp,%ebp ; save current stack in base pointer
3: 83 e4 f0 and $0xfffffff0,%esp ; align stack by 16
6: 83 ec 10 sub $0x10,%esp ; reserve 16 bytes on stack (including <int *ret;>)
9: e8 00 00 00 00 call e <_main+0xe> ; just move program pointer forward for the following instruction to be aligned
e: 8d 44 24 0c lea 0xc(%esp),%eax ; %eax = &ret
12: 83 c0 08 add $0x8,%eax ; %eax = (int*)%eax + 2
15: ba 00 00 00 00 mov $0x0,%edx ; %edx = (int)shellcode
1a: 89 10 mov %edx,(%eax) ; *(%eax) = %edx
1c: c9 leave ; restore stack & base pointer from enter
1d: c3 ret ; }
1e: 90 nop
1f: 90 nop

Disassembly of section .data:

00000000 <_shellcode>:
0: bb .byte 0xbb ; char shellcode[] = "\xbb...
1: 14 00 adc $0x0,%al ; ...\x14\x00...
... ; ..."; (should be the termination character \x00)

假设堆栈对齐不执行任何操作,您的 4 个 shellcode 字节将被复制到 ret 和保存的基指针后面的堆栈上,因此超出了函数范围。现在考虑 int main()int main(int argc, char** argv) 的快捷方式,我们得出结论:这 4 个字节替换了 argv - 在 main 中传递的命令行字符串的地址被覆盖。但为了什么?

关于c - 请帮助我理解这个 main() 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428728/

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