https://sploitfun.wordpress.com/2015/
#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;
}
#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的资料走一波
http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F
gdb 用来调适c c++ 编译的时候 -g 将编译信息增加到可执行文件中
$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello
*在终端输入:gdb
*在gdb环境中:file <program>
这两步等价于:gdb <program>
symbols <file>
-s <file>
从指定文件中读取符号表。
-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>
-c <file>
调试时core dump的core文件。
-directory <directory>
-d <directory>
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。
设置断点 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] 查看断点时
设置观察点(WatchPoint)
watch <expr>
为表达式(变量)expr设置一个观察点。一表达式值有变化时,马上停住程序。
rwatch <expr>
当表达式(变量)expr被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。
设置捕捉点
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就行了。
break foo if x>0
commands
printf "x is %d\n",x
continue
end
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函数的汇源代码
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.