下午学习的gdb指令。傻傻的对一个自己的程序输入打开指令打不开。问问才知道要先转换成可执行文件,上网有学学gcc指令收获不少啊。。
遇到问题
1、写了一个C++语言但是用指令转换成可执行文件时候呢显示iostream不存在
解决:对于C语言使用的转换指令是(假设文件是doc.c)
将C语言的文件doc.c转换为了doc
gcc doc.c -o doc
还有一个默认转换,也就是后面可以不加你转换的名字,系统默认转换后的名字为a.out
gcc doc.c
对于C++语言使用的转换指令是
g++ doc.c -o doc
2、显示j=strlen(s)语句出错。
解决:原来linux的习惯,strlen声明放在 string.h 中(linux系统中可以通过man strlen来查看其帮助和所在头文件),仅仅 #include
###3、其他指令
(1)、 将test.c预处理输出test.i文件。
gcc -E test.c -o test.i
(2)、 将预处理输出文件test.i汇编成test.s文件。
gcc -E test.c -o test.i
(3)、 将汇编输出文件test.s编译输出test.o文件。
gcc -c test.s
(4)、 将编译输出文件test.o链接成最终可执行文件test。
gcc test.o -o test
(5)、 使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。
gcc -O1 test.c -o test
4、多源文件的编译方法
(1)、多个文件一起编译
将testfun.c和test.c分别编译后链接成test可执行文件。
gcc testfun.c test.c -o test
(2)、分别编译各个源文件,之后对编译后输出的目标文件链接。
将testfun.c编译成testfun.o
将test.c编译成test.o
将testfun.o和test.o链接成test
gcc -c testfun.c
gcc -c test.c
gcc -o testfun.o test.o -o test
在搜索的过程中也发现了一个好玩的命令就先记录下吧,这是个gdb下的指令。
如果想看看现在的默认反汇编格式是什么,可以使用如下命令
(gdb) show disassembly-flavor
如果看不懂,那就转换汇编格式
(gdb) set disassembly-flavor intel
经过以上的步骤就可以把想要的可执行文件得到,下面就是对程序进行指令分析。程序为(doc)
运行程序看看
./doc
进入gdb指令下。(gdb + doc)
反编译
disassemble main
下面是基础的调试指令
名称 | 介绍 | 用法 |
---|---|---|
r | r 是run的简写,也就是在GDB下运行程序。(如果有设置断点会运行到断点) | (gdb)r |
c | C是continue的简写,就是继执行被调试的程序,直到下一次断点处或者结束 | (gdb)c |
b <行号>/<函数名称>/<函数名称>/<代码地址> | b 是breakpoint的简写,就是设置断点,可以使用行号,函数名,执行地址进行下断。而函数名前加一个*则表示将断点设置在“由编译器生成的prolog代码处”,者在了解汇编后可以理解。 | (gdb)b 8、(gdb)b main 、(gdb)b main 、(gdb)b 0x8048534 |
d [编号] | d 是delete breakpoint的简写,就是删除制定编号后的断点,也可以一次删去所有断点。 | (gdb)d 2 |
p <变量名称> | P是print的简写,显示指定变量的值(临时变量或全局变量)。 | (print)p n |
q | 不需要多解释了,就是退出调试 | (gdb)q |
S | 执行一行源代码,如果此行代码有函数调用,进入该函数,也就相当于其他调试器的单步步入。 | (gdb)s |
n | 执行一段源代码,代码中的函数调用也一并执行,也就相当于其他调试器的单步步过。 | (gdb)n |
Si ,ni | 这两个对应着的是s和n。不同的是这两个是对汇编语言的,而前两个是对源代码的。 | (gdb)si、(gdb)ni |
然后是peda的一些指令
checksec –检查二进制的各种安全选项
dumpargs –当在调用指令时停止显示参数传递给函数
elfheader–调试文件的标题指令
elfsymbol–从一个精灵文件获得非调试符号信息
lookup –搜索所有的地址/参考地址属于一个内存范围
readelf –从一个逆向文件获取标题信息
patch –内存补丁开始在字符串/ hexstring /诠释一个地址(?)
pattern –生成、搜索或写一个循环模式到内存
pshow –显示各种PEDA选项和其他设置
pset –设置各种peda选项和其他设置
procinfo –显示从/ proc / PID的各种信息
shellcode –生成或下载常见shellcodes
xormem –一个密钥异或内存区
vmmap –在调试过程中获得部分(S)的虚拟映射地址范围
ropgadget–得到的二进制或静态库共同ROP小工具
ropsearch –记忆中搜索rop小工具使用
skeleton –Python开发代码生成模板
dumprop –丢弃在特定的内存范围内所有ROP小工具
searchmem|find –在记忆中搜索模式;支持正则表达式搜索
指令中提到了一个ROP,也不知道是啥,去搜一搜,原来:
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)
这个溢出攻击可参照网址:http://www.programlife.net/linux-rop-stack-overflow.html