如何从 gdb 读取 fread 值
How to read fread values from gdb
我有一个反编译的C文件(无源代码),它读取两个文件并比较它们是否具有相同的内容。我想在 gdb 中读取 data2
的值,我试过
(gdb)x/s 0x08048591
0x8048591 <main+52>: "5E71[=10=]4$0t6771E03", <incomplete sequence 0>
对于上下文:
int main(int argc, char ** argv) {
struct _IO_FILE * stream = popen("/bin/cat ~/.flag", "r"); // 0x8048572
int32_t data;
if (fread((char *)&data, 1, 32, stream) == 0) {
// 0x80485a5
perror("fread");
// branch -> 0x8048682
// 0x8048682
return 1;
}
struct _IO_FILE * file = fopen("/var/level01/.flag", "r"); // 0x80485d5
int32_t result; // 0x8048591_06
int32_t data2;
if (fread((char *)&data2, 1, 32, file) == 0) {
// 0x8048608
perror("fread");
result = 1;
// branch -> 0x8048682
} else {
// 0x804861b
if (strcmp((char *)&data, (char *)&data2) == 0) {
// 0x804863c
execl("/bin/sh", "/bin/sh");
// branch -> 0x8048658
}
// 0x8048658
fwrite("Wrong password!\n", 1, 16, g1);
result = 0;
// branch -> 0x8048682
}
// 0x8048682
return result;
}
我不完全确定在哪里阅读以及如何在 gdb 中输出它,任何见解都将受到赞赏。
编辑:
0x0804855d <+0>: push %ebp
0x0804855e <+1>: mov %esp,%ebp
0x08048560 <+3>: sub [=12=]x5c,%esp
0x08048563 <+6>: movl [=12=]x8048720,0x4(%esp)
0x0804856b <+14>: movl [=12=]x8048722,(%esp)
0x08048572 <+21>: call 0x80483e0 <popen@plt>
0x08048577 <+26>: mov %eax,-0x4(%ebp)
0x0804857a <+29>: mov -0x4(%ebp),%eax
0x0804857d <+32>: mov %eax,0xc(%esp)
0x08048581 <+36>: movl [=12=]x20,0x8(%esp)
0x08048589 <+44>: movl [=12=]x1,0x4(%esp)
0x08048591 <+52>: lea -0x29(%ebp),%eax
0x08048594 <+55>: mov %eax,(%esp)
0x08048597 <+58>: call 0x8048410 <fread@plt>
0x0804859c <+63>: mov %eax,-0x8(%ebp)
0x0804859f <+66>: cmpl [=12=]x0,-0x8(%ebp)
0x080485a3 <+70>: jne 0x80485bb <main+94>
0x080485a5 <+72>: movl [=12=]x8048735,(%esp)
0x080485ac <+79>: call 0x80483f0 <perror@plt>
0x080485b1 <+84>: mov [=12=]x1,%eax
0x080485b6 <+89>: jmp 0x8048682 <main+293>
0x080485bb <+94>: lea -0x29(%ebp),%edx
0x080485be <+97>: mov -0x8(%ebp),%eax
0x080485c1 <+100>: add %edx,%eax
0x080485c3 <+102>: movb [=12=]x0,(%eax)
0x080485c6 <+105>: movl [=12=]x8048720,0x4(%esp)
0x080485ce <+113>: movl [=12=]x804873b,(%esp)
0x080485d5 <+120>: call 0x8048440 <fopen@plt>
0x080485da <+125>: mov %eax,-0x4(%ebp)
0x080485dd <+128>: mov -0x4(%ebp),%eax
0x080485e0 <+131>: mov %eax,0xc(%esp)
0x080485e4 <+135>: movl [=12=]x20,0x8(%esp)
0x080485ec <+143>: movl [=12=]x1,0x4(%esp)
0x080485f4 <+151>: lea -0x4a(%ebp),%eax
0x080485f7 <+154>: mov %eax,(%esp)
0x080485fa <+157>: call 0x8048410 <fread@plt>
0x080485ff <+162>: mov %eax,-0x8(%ebp)
0x08048602 <+165>: cmpl [=12=]x0,-0x8(%ebp)
0x08048606 <+169>: jne 0x804861b <main+190>
0x08048608 <+171>: movl [=12=]x8048735,(%esp)
---Type <return> to continue, or q <return> to quit---
0x0804860f <+178>: call 0x80483f0 <perror@plt>
0x08048614 <+183>: mov [=12=]x1,%eax
0x08048619 <+188>: jmp 0x8048682 <main+293>
0x0804861b <+190>: lea -0x4a(%ebp),%edx
0x0804861e <+193>: mov -0x8(%ebp),%eax
0x08048621 <+196>: add %edx,%eax
0x08048623 <+198>: movb [=12=]x0,(%eax)
0x08048626 <+201>: lea -0x4a(%ebp),%eax
0x08048629 <+204>: mov %eax,0x4(%esp)
0x0804862d <+208>: lea -0x29(%ebp),%eax
0x08048630 <+211>: mov %eax,(%esp)
0x08048633 <+214>: call 0x80483d0 <strcmp@plt>
0x08048638 <+219>: test %eax,%eax
0x0804863a <+221>: jne 0x8048658 <main+251>
0x0804863c <+223>: movl [=12=]x0,0x8(%esp)
0x08048644 <+231>: movl [=12=]x8048759,0x4(%esp)
0x0804864c <+239>: movl [=12=]x8048759,(%esp)
0x08048653 <+246>: call 0x8048450 <execl@plt>
0x08048658 <+251>: mov 0x8049980,%eax
0x0804865d <+256>: mov %eax,0xc(%esp)
0x08048661 <+260>: movl [=12=]x10,0x8(%esp)
0x08048669 <+268>: movl [=12=]x1,0x4(%esp)
0x08048671 <+276>: movl [=12=]x8048761,(%esp)
0x08048678 <+283>: call 0x8048400 <fwrite@plt>
0x0804867d <+288>: mov [=12=]x0,%eax
0x08048682 <+293>: leave
0x08048683 <+294>: ret
End of assembler dump.
I've decompiled,
很可能你弄错了。如果这是正确的反编译:
int32_t data;
if (fread((char *)&data, 1, 32, stream) == 0) {
那么程序将 "guilty" 堆栈溢出(fread
尝试读取 32 个字节,但您只提供 space 32 位(即只有4个字节))。
更有可能正确的反编译是这样的:
char data[32];
if (fread(data, 1, 32, stream) == 0) {
I want to read the values for data2, in gdb, I've tried
(gdb)x/s 0x08048591
正如 GDB 显示的那样,地址 0x08048591
在 main
中并且是程序 code.
的一部分
您想检查程序的 数据(或堆栈),为此您需要在正确的地址上使用 x/s
。
很遗憾,您没有提供程序的 实际 程序集,因此我们无法告诉您正确的地址应该是什么。
更新:
第二个 fread
的反汇编是:
0x080485f4 <+151>: lea -0x4a(%ebp),%eax
0x080485f7 <+154>: mov %eax,(%esp)
0x080485fa <+157>: call 0x8048410 <fread@plt>
这告诉我们数据实际上在堆栈上,要查看数据将使用:
x/s $ebp-0x4a
在 0x08048602
的指令处停止(即在 fread
返回后)。
我有一个反编译的C文件(无源代码),它读取两个文件并比较它们是否具有相同的内容。我想在 gdb 中读取 data2
的值,我试过
(gdb)x/s 0x08048591
0x8048591 <main+52>: "5E71[=10=]4$0t6771E03", <incomplete sequence 0>
对于上下文:
int main(int argc, char ** argv) {
struct _IO_FILE * stream = popen("/bin/cat ~/.flag", "r"); // 0x8048572
int32_t data;
if (fread((char *)&data, 1, 32, stream) == 0) {
// 0x80485a5
perror("fread");
// branch -> 0x8048682
// 0x8048682
return 1;
}
struct _IO_FILE * file = fopen("/var/level01/.flag", "r"); // 0x80485d5
int32_t result; // 0x8048591_06
int32_t data2;
if (fread((char *)&data2, 1, 32, file) == 0) {
// 0x8048608
perror("fread");
result = 1;
// branch -> 0x8048682
} else {
// 0x804861b
if (strcmp((char *)&data, (char *)&data2) == 0) {
// 0x804863c
execl("/bin/sh", "/bin/sh");
// branch -> 0x8048658
}
// 0x8048658
fwrite("Wrong password!\n", 1, 16, g1);
result = 0;
// branch -> 0x8048682
}
// 0x8048682
return result;
}
我不完全确定在哪里阅读以及如何在 gdb 中输出它,任何见解都将受到赞赏。
编辑:
0x0804855d <+0>: push %ebp
0x0804855e <+1>: mov %esp,%ebp
0x08048560 <+3>: sub [=12=]x5c,%esp
0x08048563 <+6>: movl [=12=]x8048720,0x4(%esp)
0x0804856b <+14>: movl [=12=]x8048722,(%esp)
0x08048572 <+21>: call 0x80483e0 <popen@plt>
0x08048577 <+26>: mov %eax,-0x4(%ebp)
0x0804857a <+29>: mov -0x4(%ebp),%eax
0x0804857d <+32>: mov %eax,0xc(%esp)
0x08048581 <+36>: movl [=12=]x20,0x8(%esp)
0x08048589 <+44>: movl [=12=]x1,0x4(%esp)
0x08048591 <+52>: lea -0x29(%ebp),%eax
0x08048594 <+55>: mov %eax,(%esp)
0x08048597 <+58>: call 0x8048410 <fread@plt>
0x0804859c <+63>: mov %eax,-0x8(%ebp)
0x0804859f <+66>: cmpl [=12=]x0,-0x8(%ebp)
0x080485a3 <+70>: jne 0x80485bb <main+94>
0x080485a5 <+72>: movl [=12=]x8048735,(%esp)
0x080485ac <+79>: call 0x80483f0 <perror@plt>
0x080485b1 <+84>: mov [=12=]x1,%eax
0x080485b6 <+89>: jmp 0x8048682 <main+293>
0x080485bb <+94>: lea -0x29(%ebp),%edx
0x080485be <+97>: mov -0x8(%ebp),%eax
0x080485c1 <+100>: add %edx,%eax
0x080485c3 <+102>: movb [=12=]x0,(%eax)
0x080485c6 <+105>: movl [=12=]x8048720,0x4(%esp)
0x080485ce <+113>: movl [=12=]x804873b,(%esp)
0x080485d5 <+120>: call 0x8048440 <fopen@plt>
0x080485da <+125>: mov %eax,-0x4(%ebp)
0x080485dd <+128>: mov -0x4(%ebp),%eax
0x080485e0 <+131>: mov %eax,0xc(%esp)
0x080485e4 <+135>: movl [=12=]x20,0x8(%esp)
0x080485ec <+143>: movl [=12=]x1,0x4(%esp)
0x080485f4 <+151>: lea -0x4a(%ebp),%eax
0x080485f7 <+154>: mov %eax,(%esp)
0x080485fa <+157>: call 0x8048410 <fread@plt>
0x080485ff <+162>: mov %eax,-0x8(%ebp)
0x08048602 <+165>: cmpl [=12=]x0,-0x8(%ebp)
0x08048606 <+169>: jne 0x804861b <main+190>
0x08048608 <+171>: movl [=12=]x8048735,(%esp)
---Type <return> to continue, or q <return> to quit---
0x0804860f <+178>: call 0x80483f0 <perror@plt>
0x08048614 <+183>: mov [=12=]x1,%eax
0x08048619 <+188>: jmp 0x8048682 <main+293>
0x0804861b <+190>: lea -0x4a(%ebp),%edx
0x0804861e <+193>: mov -0x8(%ebp),%eax
0x08048621 <+196>: add %edx,%eax
0x08048623 <+198>: movb [=12=]x0,(%eax)
0x08048626 <+201>: lea -0x4a(%ebp),%eax
0x08048629 <+204>: mov %eax,0x4(%esp)
0x0804862d <+208>: lea -0x29(%ebp),%eax
0x08048630 <+211>: mov %eax,(%esp)
0x08048633 <+214>: call 0x80483d0 <strcmp@plt>
0x08048638 <+219>: test %eax,%eax
0x0804863a <+221>: jne 0x8048658 <main+251>
0x0804863c <+223>: movl [=12=]x0,0x8(%esp)
0x08048644 <+231>: movl [=12=]x8048759,0x4(%esp)
0x0804864c <+239>: movl [=12=]x8048759,(%esp)
0x08048653 <+246>: call 0x8048450 <execl@plt>
0x08048658 <+251>: mov 0x8049980,%eax
0x0804865d <+256>: mov %eax,0xc(%esp)
0x08048661 <+260>: movl [=12=]x10,0x8(%esp)
0x08048669 <+268>: movl [=12=]x1,0x4(%esp)
0x08048671 <+276>: movl [=12=]x8048761,(%esp)
0x08048678 <+283>: call 0x8048400 <fwrite@plt>
0x0804867d <+288>: mov [=12=]x0,%eax
0x08048682 <+293>: leave
0x08048683 <+294>: ret
End of assembler dump.
I've decompiled,
很可能你弄错了。如果这是正确的反编译:
int32_t data;
if (fread((char *)&data, 1, 32, stream) == 0) {
那么程序将 "guilty" 堆栈溢出(fread
尝试读取 32 个字节,但您只提供 space 32 位(即只有4个字节))。
更有可能正确的反编译是这样的:
char data[32];
if (fread(data, 1, 32, stream) == 0) {
I want to read the values for data2, in gdb, I've tried
(gdb)x/s 0x08048591
正如 GDB 显示的那样,地址 0x08048591
在 main
中并且是程序 code.
您想检查程序的 数据(或堆栈),为此您需要在正确的地址上使用 x/s
。
很遗憾,您没有提供程序的 实际 程序集,因此我们无法告诉您正确的地址应该是什么。
更新:
第二个 fread
的反汇编是:
0x080485f4 <+151>: lea -0x4a(%ebp),%eax
0x080485f7 <+154>: mov %eax,(%esp)
0x080485fa <+157>: call 0x8048410 <fread@plt>
这告诉我们数据实际上在堆栈上,要查看数据将使用:
x/s $ebp-0x4a
在 0x08048602
的指令处停止(即在 fread
返回后)。