8月

T1d 2023-8-22 720 8/22

8月21日 周一 晴

  • 复现WMCTF2023的jit
  • 出门打球
  • 开始训练逆向VMPWN

好吧,看不下去一点jit,请教了一下λ师傅,师傅耐心讲解了,可我还是卡住了,哎,菜菜┭┮﹏┭┮。

准备最近多花点时间刷点VMPWN的题了,好几次比赛拿到VMPWN都手足无措,可是真的不想逆向诶┭┮﹏┭┮

好久没动过了,打了两天WMCTF就做了一个blindless,一直坐着腰酸背痛的,今天去打会儿乒乓球,和公园大爷车轮战,所以到底谁是年轻人???累死俺了哎

8月22日 周二 晴

  • 继续复现WMCTF2023的jit
  • 继续出门打球
  •  陪姐姐聊天(bushi)
  •  听姐姐唱的歌
  •  顺便实现了批量爬取下载某指定用户的所有歌曲的脚本(全民K歌)

今天七夕诶,又是陪姐姐聊天的一天,又是jit被鸽的一天,笑死。下午忙着写脚本把姐姐全民K歌的歌都爬下来嘿嘿嘿,晚上才去打球,好累,大爷们体力真好,我实在打不动了呜呜呜

(给一个全民K歌下载器的链接:https://github.com/TLD1027/QMKG-Download/

8月23日 周三 阴

  •  再探openat函数
  •  了解rlimit结构体与文件资源限制和解除
  •  学习编写C语言沙盒

今天做到一个题,限制了execve和open,但是我用openat一直打不开flag文件,于是顺便复习了一下openat函数。

openat(0, "/flag", 0)
openat(-100, "./flag", 0)

其次是这个题没有打开是因为文件在沙盒函数后面还设置了最大打开的文件描述符为0:

rlimits.rlim_cur = 0LL;
setrlimit(RLIMIT_NOFILE, &rlimits);

因此我们在调用openat去打开flag文件之前要再次调用setrlimit函数伪造一个rlimit结构体来解除这个资源限制。同时因为这个题我才意识到我其实至今不会写沙盒函数,因此今天借此机会学习了一下沙盒函数的编写,嘿嘿可以拿去出新生赛咯~

8月24日 周四 阴

  •  分析exit函数
  •  探究2.35下的exit_hook利用
  •  借此出一道新生赛exit的利用

打WMCTF的时候遇到了一道231的blindness,当时分析的时候跟踪exit函数找到了两个很有趣的函数跳转,因此后来想借此看看能不能找到能在高版本下利用的exit_hook。首先是原本的exit_hook,由于新版本下存储exit_hook的段已经不可写了,所以这条路行不通了,接着跟踪我们会发现一个call [rax],这个rax是通过存储在libc上的程序机制加上存储在libc上的函数偏移来控制的,很巧合的是,这两个地址都是可写的,同时,rdi寄存器也是一个在libc上的可写地址,也就意味着我们能像做blindness一样去实现system("/bin/sh"),但是现实很残酷,原本的exit_hook其实是两个进程锁,分别对应加锁和解锁,在低版本中这两个函数感觉形同虚设,或者说与rdi没什么关系,因此在低版本下改rdi为“/bin/sh”成功了,但是高版本会检查rdi是否为空值,如果不是空值,那么在加锁时会进入死锁状态。当然我们也考虑使用ogg直接getshell,但是很不巧的是,这里的寄存器并不符合博主找到的所以ogg的要求,因此暂时这条链子可能止步于231了。这里挖个坑,后面要是找到新的办法了再来填坑。同时既然分析到这里了,也就出了一个231的blindness希望能去分析一下exit看看能不能有点新的发现或者利用,当然对于原有的exit_hook做了限制,不能直接打exit_hook的,要是你看到了这里,我相信你一定能完成这道exit lab了吧~

8月25日 周五 晴

  • 再次看jit
  • 陪姐姐聊天吹水(bushi)

一如既往,jit看得我头都大了,我还是没分析出来,继续鸽着吧~

8月26日 周六 晴

  • 蓝帽杯pwn
  • 陇剑杯pwn
  • 打球

好极了,今天打了两比赛,两取证杯,真的无fuck说,陇剑杯根本没有pwn,就是纯坐牢,还得录着屏,然后打蓝帽的pwn(这何尝又不是一种牛头人呢)。蓝帽的pwn也很抽象,第一个题很傻逼,拿了个三血之后看见公告写的ak,以为不会上新题了,就去玩了,快结束才看见又上了一个,赛后和别的师傅交流了一下感觉也没什么有趣的,懒得复现了,还得录屏到6点,球也没时间打了呜呜呜

8月27日 周日 晴

  • nssctf2nd pwn
  • 返校
  • 在学校里面闲逛

今天返校,上午没时间看题,在高铁上看了一下,第一题是个异架构,不会,第二题是个盲打?也不会,开摆。谁知道下午实在无聊,来看看这两题,第一题我实在不会跑,ida反编译也没编译出来,但是啊,我发现ghidra有linux版本,好,太好了,ghidra启动!打开一看,有后门,有偏移执行,但是偏移值有限制,再一看,类型转换的时候有漏洞,直接偏移到后门执行就行了,本地也试不了,直接远程打了,通了,好家伙!第二题再一看看见结尾的==盲猜base64加密了,拉下来解密,一堆乱码里面夹杂着libc,不对劲,不会是elf文件吧,果然!本老实人开始分析,瞪眼法找到了直达后门的方法,写shellcode一气呵成,然后发现远程的elf每次连上去都不一样,大意了,不会了,开摆!后面上了第三题,前面需要泄露地址,成功之后就能去执行shellcode了,晚上太困没思路,跑到学校里面转悠了一大圈(似乎和姐姐无意间面基了),回来睡大觉。

下面总结一下比赛遇到的东西:在禁用了open,read,write函数的情况下怎么操作?

首先open就不说了,openat已经用烂了,read和write呢也有替代品:readv和writev

readv(fd, struct, num);
writev(fd, struct, num);

第一个参数就不解释了,struct其实就是需要我们去伪造一个结构体,这个结构体里面就两东西,地址和size,和正常的read和write后两个参数的效果是一样的,只是独立出来写成了结构体,最后一个参数是读取的数量,一般我们只需要读取一个flag,就设置成1就行了。

另外还有两个读取可用的调用:preadv和mmap

preadv(fd, struct, num, offset);
mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

preadv和readv只多了一个参数offset,表示偏移,设置成0就行了,而mmap是直接把文件映射到内存中,addr设置成一个需要读过去的地址,length设置1000就行,prot设置成1flags设置成1,fd为文件标识符,offset直接无脑设置0即可

在用到这另两个系统调用时存在一个问题,那就是直接调用syscall的时候传参寄存器和平时使用函数有点不一样,依次是

rdi
rsi
rdx
r10
r8
r9

 

- THE END -
Tag:

T1d

12月03日11:33

最后修改:2023年12月3日
1

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论

您必须 后可评论