From 9091d1ed10c089df75e455c58fceaaf293bd6567 Mon Sep 17 00:00:00 2001 From: EleganceCoding <47825821+wangjunstf@users.noreply.github.com> Date: Mon, 30 May 2022 23:49:26 +0800 Subject: [PATCH] =?UTF-8?q?edit=20Linux=20=E7=BC=93=E5=86=B2=E5=8C=BA?= =?UTF-8?q?=E6=BA=A2=E5=87=BA=E6=94=BB=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...72\346\272\242\345\207\272\346\224\273\345\207\273.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/Linux \347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.md" "b/Linux \347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.md" index ceff39f..f71f5a6 100644 --- "a/Linux \347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.md" +++ "b/Linux \347\274\223\345\206\262\345\214\272\346\272\242\345\207\272\346\224\273\345\207\273.md" @@ -32,7 +32,7 @@ set disassembly-flavor intel | | 栈帧 | | +--------------------------------------+ 低内存地址 ESP EBP 高内存地址 -0x11111111 0xfffffff0 +0x11111111 0xfffffff0 ``` ## 3 函数调用过程 @@ -296,7 +296,7 @@ eip 0x41414141 0x41414141 | | ESP | name | EBP | EIP| temp | +----------------------------------------------+ 低内存地址 高内存地址 -0x11111111 0xfffffff0 +0x11111111 0xfffffff0 ``` 通过源码,我们知道在 greeting 函数中的 strcpy()函数之后有一个 printf() 函数调用,这个printf 又调用 libc 库中的 vfprintf(),vfprintf() 函数又调用 strlen。这里进行了多次嵌套函数调用,因此存在多个栈帧,每一个栈帧都被压入栈中。当溢出时,可能会导致传入函数的参数被破坏掉,上述溢出不仅写入旧的 eip,还将函数参数覆盖了。由于 printf() 函数会使用 temp,因此会遇到问题。下面使用gdb验证。 @@ -366,7 +366,7 @@ Breakpoint 1, greeting (temp2=0xffffd400 "\v") at meet.c:9 | | ESP | name | EBP | EIP| temp | +----------------------------------------------+ 低内存地址 当前EBP 高内存地址 -0x11111111 0xfffffff0 +0x11111111 0xfffffff0 ``` @@ -746,7 +746,7 @@ cc -ggdb -O0 -fno-stack-protector -zexecstack -mpreferred-stack-boundary=2 -m32 | | | | | | 低内存地址 shellcode 地址 高内存地址 -0x11111111 0xffffdff8 +0x11111111 0xffffdff8 ``` 在 Debian 系统下,它是`0xffffdff8`,其它Linux发行版可能有差异。获取该地址的方法如下: