我正在Overthewire narnia2(ctf游戏)上工作。 目前,我正在学习如何使用gdb,并且我有一个简单的问题。
(gdb) x/200x $esp-0xac
0xffffd5a4: 0x08048534 0xffffd5c8 0xf7e5b7d0 0xffffd5c8
0xffffd5b4: 0xf7ffd920 0xf7e5b7d5 0x08048494 0x08048534
0xffffd5c4: 0xffffd5c8 0x6850c031 0x68732f2f 0x69622f68
0xffffd5d4: 0x50e3896e 0x89e18953 0xcd0bb0c2 0x41414180
0xffffd5e4: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd5f4: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd604: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd614: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd624: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd634: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd644: 0x41414141 0x62626262 0xf7e2a200 0x00000002
0xffffd654: 0xffffd6e4 0xffffd6f0 0x00000000 0x00000000
0xffffd664: 0x00000000 0xf7fc5000 0xf7ffdc0c 0xf7ffd000
0xffffd674: 0x00000000 0x00000002 0xf7fc5000 0x00000000
0xffffd684: 0x59e07c0a 0x6308501a 0x00000000 0x00000000
(gdb) x/200x $esp
0xffffd7a0: 0x000036b2 0x0000000e 0x000036b2 0x00000017
0xffffd7b0: 0x00000001 0x00000019 0xffffd7eb 0x0000001a
0xffffd7c0: 0x00000000 0x0000001f 0xffffdfe8 0x0000000f
0xffffd7d0: 0xffffd7fb 0x00000000 0x00000000 0x00000000
0xffffd7e0: 0x00000000 0x00000000 0x8b000000 0xb1cfbc04
0xffffd7f0: 0x91563e77 0xcb1ff506 0x6957e20c 0x00363836
0xffffd800: 0x00000000 0x00000000 0x00000000 0x72616e2f
0xffffd810: 0x2f61696e 0x6e72616e 0x00326169 0x41414141
0xffffd820: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd830: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd840: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd850: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd860: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd870: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd880: 0x41414141 0x31414141 0x2f6850c0 0x6868732f
0xffffd890: 0x6e69622f 0x5350e389 0xc289e189 0x80cd0bb0
我执行$ esp-0xac时要看什么?我也看到过其他方法,例如$ esp-0x14,但是为什么不使用普通$ esp? 什么是最常用的?为什么?
答案 0 :(得分:1)
我做$ esp-0xac时要看什么?
$esp
寄存器指向堆栈中已使用和未使用部分之间的边界(在内存中)。在i*86
处理器上,堆栈增长到较低的地址,因此上方(位于较高地址)的任何内容$esp
包含堆栈的已使用部分(局部变量,返回地址,保存的寄存器等)以及以下内容(位于较低地址的地址)包含堆栈中当前未使用的部分。
命令x/200x $esp-0xac
然后检查当前使用的堆栈的43个32位字的内容以及堆栈中未使用的157个字的内容。
ive还看到了其他方法,例如$ esp-0x14,但是为什么不使用普通$ esp?
$esp-0x14
将让您查看堆栈中的最后5个使用过的单词。使用$esp
将使您查看堆栈的未使用部分。您可以这样做,但这毫无意义。
最常用的是什么,为什么?
当您要存储某些特定值的位置(例如在漏洞利用/堆栈缓冲区溢出分析期间)或在机器指令级别进行调试时,检查堆栈很有用。