前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学pwn 经典堆栈的缓冲区溢出

学pwn 经典堆栈的缓冲区溢出

作者头像
用户5878089
发布2019-07-25 16:28:45
7490
发布2019-07-25 16:28:45
举报

学pwn 经典堆栈的缓冲区溢出

代码语言:javascript
复制
https://sploitfun.wordpress.com/2015/
简单的栈溢出例子:
漏洞代码:
代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
        /* [1] */ char buf[256];
        /* [2] */ strcpy(buf,argv[1]);
        /* [3] */ printf("Input:%s\n",buf);
        return 0;
}
编译 运行
代码语言:javascript
复制
#echo 0 > /proc/sys/kernel/randomize_va_space
#用于关闭系统级别的alsr
$gcc -g -fno-stack-protector -z execstack -o vuln vuln.c
$sudo chown root vuln
$sudo chgrp root vuln
$sudo chmod +s vuln
调试

gdb的资料走一波

代码语言:javascript
复制
http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F
学习gdb

gdb 用来调适c c++ 编译的时候 -g 将编译信息增加到可执行文件中

$gcc -g -Wall hello.c -o hello $g++ -g -Wall hello.cpp -o hello

启动方法
  1. gdb
  2. gdb core core是程序非法执行后core dump后产生的文件
  3. gdb 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
  4. 也可以先进入gdb环境,在加载被调试程序
代码语言:javascript
复制
    *在终端输入:gdb
    *在gdb环境中:file <program>
    这两步等价于:gdb <program>
常见参数
代码语言:javascript
复制
symbols <file>
-s <file>
    从指定文件中读取符号表。
-se file
    从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>
-c <file>
    调试时core dump的core文件。
-directory <directory>
-d <directory>
    加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。
常见命令
代码语言:javascript
复制
设置断点 b func 
退出 q
执行系统命令 shell <command string>
l或list命令 确认是否读出源代码
set args 可指定运行时参数
show args 命令可以查看设置好的运行参数。 
path <dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。 
cd <dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。 
break <function>  在进入指定函数时停住
break <linenum>   在指定行号停住。
break +offset
break -offset   在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum   在源文件filename的linenum行处停住。
break filename:function   在源文件filename的function函数的入口处停住。
break *address  在程序运行的内存地址处停住。
break  命令没有参数时,表示在下一条指令处停住。
break ... if <condition>  可以设置break if i==100,表示当i为100时停住程序
info breakpoints [n] 查看断点时
代码语言:javascript
复制
设置观察点(WatchPoint)
watch <expr>
    为表达式(变量)expr设置一个观察点。一表达式值有变化时,马上停住程序。
rwatch <expr>
    当表达式(变量)expr被读时,停住程序。
awatch <expr>
    当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
    列出当前所设置了的所有观察点。
代码语言:javascript
复制
设置捕捉点
catch <event>
    throw 一个C++抛出的异常。(throw为关键字)
    catch 一个C++捕捉到的异常。(catch为关键字)
    exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
    fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
    vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
    load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
    unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

断点设置在函数foo中,断点条件是x>0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。

如果你要清除断点上的命令序列,那么只要简单的执行一下commands命令,并直接再打个end就行了。

代码语言:javascript
复制
break foo if x>0
commands
printf "x is %d\n",x
continue
end
代码语言:javascript
复制
continue命令恢复程序的运行直到程序结束,或下一个断点到来
使用step或next命令单步跟踪程序
set step-mode on
    打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数很有利于查看机器码。
until 或 u
    当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
stepi 或 si
nexti 或 ni
    单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成.
如果你程序是多线程的话,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。
break <linespec> thread <threadno>
break <linespec> thread <threadno> if ...
backtrace
bt
    打印当前的函数调用栈的所有信息。
backtrace <n>
bt <n>
    n是一个正整数,表示只打印栈顶上n层的栈信息。
backtrace <-n>
bt <-n>
    -n表一个负整数,表示只打印栈底下n层的栈信息。 
frame <n>
f <n>
    n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
up <n>
    表示向栈的上面移动n层,可以不打n,表示向上移动一层。
down <n>
    表示向栈的下面移动n层,可以不打n,表示向下移动一层。
info f
    这个命令会打印出更为详细的当前栈层的信息,
info args
    打印出当前函数的参数名及其值。
info locals
    打印出当前函数中所有局部变量及其值。
info catch
    打印出当前的函数中的异常处理信息。
disassemble  你可以查看源程序的当前执行时的机器码
info registers
    查看寄存器的情况。(除了浮点寄存器)
info all-registers
    查看所有寄存器的情况。(包括浮点寄存器)
info registers <regname ...>
    查看所指定的寄存器的情况。
jump <linespec>
    指定下一条语句的运行点。<linespce>可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表示着下一条运行语句从哪里开始。
jump <address>
    这里的<address>是代码行的内存地址。
开始调试

读main函数的汇源代码

代码语言:javascript
复制
 gdb-peda$ disassemble main
Dump of assembler code for function main:
   0x0804844d <+0>:    push   ebp
   0x0804844e <+1>:    mov    ebp,esp
   0x08048450 <+3>:    and    esp,0xfffffff0
   0x08048453 <+6>:    sub    esp,0x110
   0x08048459 <+12>:    mov    eax,DWORD PTR [ebp+0xc]
   0x0804845c <+15>:    add    eax,0x4
   0x0804845f <+18>:    mov    eax,DWORD PTR [eax]
   0x08048461 <+20>:    mov    DWORD PTR [esp+0x4],eax
   0x08048465 <+24>:    lea    eax,[esp+0x10]
   0x08048469 <+28>:    mov    DWORD PTR [esp],eax
   0x0804846c <+31>:    call   0x8048320 <strcpy@plt>
   0x08048471 <+36>:    lea    eax,[esp+0x10]
   0x08048475 <+40>:    mov    DWORD PTR [esp+0x4],eax
   0x08048479 <+44>:    mov    DWORD PTR [esp],0x8048520
   0x08048480 <+51>:    call   0x8048310 <printf@plt>
   0x08048485 <+56>:    mov    eax,0x0
   0x0804848a <+61>:    leave  
   0x0804848b <+62>:    ret    
End of assembler dump.
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无级安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学pwn 经典堆栈的缓冲区溢出
    • 简单的栈溢出例子:
      • 漏洞代码:
        • 编译 运行
          • 调试
            • 学习gdb
            • 开始调试
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档