由于我知道堆栈是一个FILO段(First In Last Out),在创建这个程序时(如下所示),我认为auth_flag vairable存储在password_buffer变量之后:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char *password) {
int auth_flag = 0;
char password_buffer[16];
...
}
int main(int argc, char *argv[]) {
....
}
Run Code Online (Sandbox Code Playgroud)
当我在gdb中检查auth_flag和password_buffer的位置时,我确实看到auth_flag在password_buffer之后是28个字节:
(gdb) x/s password_buffer
0x7fffffffe3f0: "\001"
(gdb) x/xw &auth_flag
0x7fffffffe40c: 0x00000000
(gdb) # now let's print how many bytes is auth_flag away from password_buffer
(gdb) print 0x7fffffffe40c - 0x7fffffffe3f0
$3 = 28
(gdb) # so auth_flag is 28 bytes after password_buffer
Run Code Online (Sandbox Code Playgroud)
在反转变量的声明之后,我希望在auth_flag之后存储password_buffer:
int check_authentication(char *password) {
char password_buffer[16];
int …
Run Code Online (Sandbox Code Playgroud) 我编写了一个汇编程序,出于测试目的,只需退出.代码如下:
section .text
_global start
_start:
mov eax, 1
mov ebx, 0
int 0x80
Run Code Online (Sandbox Code Playgroud)
该程序显然是32位; 但是,我使用1个64位处理器和操作系统,所以我编译它(使用nasm)并将其链接如下:
nasm -f elf exit.asm
ld -m elf_i386 -s -o exit exit.o
Run Code Online (Sandbox Code Playgroud)
用gdb调试程序,我无法列出代码,因为没有调试符号.
(gdb) list
No symbol table is loaded. Use the "file" command.
Run Code Online (Sandbox Code Playgroud)
在使用gcc时,您可以使用选项-ggdb在编译ac文件时加载符号.但是因为我不知道如何使用gcc为64位机器编译32位程序集(我已经搜索了这个但是找不到解决方案),我被迫使用ld.我可以使用ld加载调试符号吗?对不起长期的问题和多余的信息感到抱歉.提前致谢.