Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从gdb读取fread值_C_Assembly_Gdb_Decompiling - Fatal编程技术网

C 如何从gdb读取fread值

C 如何从gdb读取fread值,c,assembly,gdb,decompiling,C,Assembly,Gdb,Decompiling,我有一个反编译过的C文件(没有源代码),它读取两个文件并比较是否有相同的内容。我想在gdb中读取data2的值,我已经尝试过了 (gdb)x/s 0x08048591 0x8048591 <main+52>: "\215E\327\211\004$\350t\376\377\377\211E\370\203", <incomplete sequence \370> 我不完全确定在哪里阅读以及如何在gdb中输出这些内容,任何见解都值得赞赏 编辑: 0x0804855

我有一个反编译过的C文件(没有源代码),它读取两个文件并比较是否有相同的内容。我想在gdb中读取
data2
的值,我已经尝试过了

(gdb)x/s 0x08048591
0x8048591 <main+52>:    "\215E\327\211\004$\350t\376\377\377\211E\370\203", <incomplete sequence \370>
我不完全确定在哪里阅读以及如何在gdb中输出这些内容,任何见解都值得赞赏

编辑:

0x0804855d:推送%ebp
0x0804855e:mov%esp,%ebp
0x08048560:sub$0x5c,%esp
0x08048563:movl$0x8048720,0x4(%esp)
0x0804856b:movl$0x8048722,(%esp)
0x0804872:调用0x80483e0
0x08048577:mov%eax,-0x4(%ebp)
0x0804857a:mov-0x4(%ebp),%eax
0x0804857d:mov%eax,0xc(%esp)
0x08048581:movl$0x20,0x8(%esp)
0x08048589:movl$0x1,0x4(%esp)
0x08048591:lea-0x29(%ebp),%eax
0x08048594:mov%eax,(%esp)
0x08048597:调用0x8048410
0x0804859c:mov%eax,-0x8(%ebp)
0x0804859f:cmpl$0x0,-0x8(%ebp)
0x080485a3:jne 0x80485bb
0x080485a5:movl$0x8048735,(%esp)
0x080485ac:调用0x80483f0
0x080485b1:mov$0x1,%eax
0x080485b6:jmp 0x8048682
0x080485bb:lea-0x29(%ebp),%edx
0x080485be:mov-0x8(%ebp),%eax
0x080485c1:添加%edx,%eax
0x080485c3:movb$0x0,(%eax)
0x080485c6:movl$0x8048720,0x4(%esp)
0x080485ce:movl$0x804873b,(%esp)
0x080485d5:调用0x8048440
0x080485da:mov%eax,-0x4(%ebp)
0x080485dd:mov-0x4(%ebp),%eax
0x080485e0:mov%eax,0xc(%esp)
0x080485e4:movl$0x20,0x8(%esp)
0x080485ec:movl$0x1,0x4(%esp)
0x080485f4:lea-0x4a(%ebp),%eax
0x080485f7:mov%eax,(%esp)
0x080485fa:调用0x8048410
0x080485ff:mov%eax,-0x8(%ebp)
0x08048602:cmpl$0x0,-0x8(%ebp)
0x08048606:jne 0x804861b
0x08048608:movl$0x8048735,(%esp)
---键入以继续,或键入q以退出---
0x0804860f:调用0x80483f0
0x08048614:mov$0x1,%eax
0x08048619:jmp 0x8048682
0x0804861b:lea-0x4a(%ebp),%edx
0x0804861e:mov-0x8(%ebp),%eax
0x08048621:添加%edx,%eax
0x08048623:movb$0x0,(%eax)
0x08048626:lea-0x4a(%ebp),%eax
0x08048629:mov%eax,0x4(%esp)
0x0804862d:lea-0x29(%ebp),%eax
0x08048630:mov%eax,(%esp)
0x08048633:调用0x80483d0
0x08048638:测试%eax,%eax
0x0804863a:jne 0x8048658
0x0804863c:movl$0x0,0x8(%esp)
0x08048644:movl$0x8048759,0x4(%esp)
0x0804864c:movl$0x8048759,(%esp)
0x08048653:呼叫0x8048450
0x08048658:mov 0x8049980,%eax
0x0804865d:mov%eax,0xc(%esp)
0x08048661:movl$0x10,0x8(%esp)
0x08048669:movl$0x1,0x4(%esp)
0x08048671:movl$0x8048761,(%esp)
0x08048678:调用0x8048400
0x0804867d:mov$0x0,%eax
0x08048682:离开
0x08048683:ret
汇编程序转储结束。
我已经反编译了

你很可能犯了错误。如果这是正确的反编译:

int32_t data;
if (fread((char *)&data, 1, 32, stream) == 0) {
然后程序将“有罪”堆栈溢出(
fread
尝试读取32个字节,但您只为32位(即仅4个字节)提供了空间)

更可能的是,正确的反编译类似于:

char data[32];
if (fread(data, 1, 32, stream) == 0) {
我想读取data2的值,在gdb中,我已经尝试过了
(gdb)x/s 0x08048591

如GDB所示,地址
0x08048591
位于
main
内,是程序代码的一部分

要检查程序的数据(或堆栈),需要在正确的地址上使用
x/s

不幸的是,您没有提供程序的实际汇编,因此我们无法告诉您正确的地址应该是什么

更新:

第二个
fread
的反汇编为:

0x080485f4 <+151>:   lea    -0x4a(%ebp),%eax
0x080485f7 <+154>:   mov    %eax,(%esp)
0x080485fa <+157>:   call   0x8048410 <fread@plt>

当在
0x08048602
处的指令处停止时(即
fread
返回后)。

为什么不在gdb中打印
data2
变量?@ks1322挑战不允许我编译/执行此源代码或移动/复制它读取的两个文件。我唯一的选择是gdb输出文件(没有源代码)。我的想法是打印它,但我甚至不能在gdb中列出,所以不知道打印什么谢谢你的回复,我认为这太多了,我已经为main添加了汇编代码,我得到0xbffff69e:。我尝试在main、那个些地址和每个“next”使用断点。有什么想法吗?@user153882我已经更新了答案。1.您(显然)只需要在
fread
返回后查看数据。2.数据可能是二进制的,这取决于文件中的内容,所以“不完整的序列”并不意味着有任何问题。谢谢,这对我帮助很大
char data[32];
if (fread(data, 1, 32, stream) == 0) {
0x080485f4 <+151>:   lea    -0x4a(%ebp),%eax
0x080485f7 <+154>:   mov    %eax,(%esp)
0x080485fa <+157>:   call   0x8048410 <fread@plt>
x/s $ebp-0x4a