我是逆向工程 C 二进制文件的新手,但一直在研究旧的 ctf 并想要求解释特定的汇编命令以及缓冲区溢出如何强制调用函数。
我已经使用 ghidra 和 IDA 拆开了一个二进制文件。它是一个非常标准的 C 程序,带有 main() 函数和方法:
int main(void)
{
body();
return 0;
}
void body(void)
{
char buffer [500];
int size;
/* gather input and print to the console */
size = read(0,buffer,700);
printf("\nUser provided %d bytes. Buffer content is: %s\n",size,buffer);
return;
}
(注意列出的函数是从汇编代码重建的,因此可能不完全正确。)在这一点上,我认为缓冲区溢出一定是攻击的目标。
进一步搜索程序找到了这个函数,我得出结论我想调用它:
void success(void)
{
system("cat file_you_cant_access.txt");
return;
}
这个函数从未被调用,但它显然是挑战的答案。所以我的问题是如何修改 main/body 来调用这个辅助函数。
不幸的是,我不太了解汇编代码,因此无法理解地址的存储位置和函数的调用位置。可能这里有一些可能很重要的行(它们是辅助方法中的行):
/* gather input and print to the console */
08048491 55 PUSH EBP
08048492 89 e5 MOV EBP,ESP
08048494 81 ec 18 SUB ESP,0x218
02 00 00
0804849a c7 44 24 MOV dword ptr [ESP + local_214],0x2bc
08 bc 02
00 00
080484a2 8d 85 00 LEA EAX=>local_204,[EBP + 0xfffffe00]
fe ff ff
080484a8 89 44 24 04 MOV dword ptr [ESP + local_218],EAX
080484ac c7 04 24 MOV dword ptr [ESP]=>local_21c,0x0
00 00 00 00
080484b3 e8 78 fe CALL read ssize_t read(int __fd, void * __
ff ff
080484b8 89 45 f4 MOV dword ptr [EBP + local_10],EAX
080484bb 8d 85 00 LEA EAX=>local_204,[EBP + 0xfffffe00]
fe ff ff
080484c1 89 44 24 08 MOV dword ptr [ESP + local_214],EAX
080484c5 8b 45 f4 MOV EAX,dword ptr [EBP + local_10]
080484c8 89 44 24 04 MOV dword ptr [ESP + local_218],EAX
080484cc c7 04 24 MOV dword ptr [ESP]=>local_21c,s__User_provided_%d = "\nUser provided %d bytes. Buf
a0 85 04 08
问题是似乎不可能将缓冲区溢出到任何有意义的地方。如果答案不明显,也许您可以带我了解您会采取什么方法?