这次比赛放了三道pwn,做起来还是蛮吃力的,shellcode那题还是经过师傅们提示才做出来的,R()P这题到比赛结束也没有做出来。通过这次比赛感觉自己对于汇编中的gadget理解和利用还是有写不足,在此写下wp记录一下解题的过程。

阅读全文 »

通过这道题的学习和收获有:

1、栈迁移,何为栈?本来栈的定义就是rsp指针与rbp指针之间的就是栈。rsp在哪栈就在哪,因此两次leave,栈就变了两次,而真正跳到变化的栈那步是在最后的ret执行的。也算是对栈迁移又有了一点新的理解。

2、利用magic gadget修改got表

3、这道题的核心考察的就是栈迁移以及payload布局。

4、取magic gadget中的ebx时,如果ebx的值为正,则直接取,如果为负,则加0x100000000取补码。

5、如果可以的话,迁移到bss段尽量迁移到地址高一点的地方。这次打远程的那个exp就是因为bss段迁移的太低了,因为是破坏了某些数据,导致最后执行system函数的时候卡住了。

阅读全文 »

通过这道题的学习与总结:

1、rep指令是进行循环,movs qword ptr [rdi],qword ptr[rsi]则可以拷贝,二者结合就是可以大规模拷贝数据到另一个内存空间。而想实现它,仅仅只需要控制rdi和rsi以及rcx寄存器即可。

2、我们往可读可写可执行的内存中写入的任何机器码都是可以被当做指令来执行的,而想执行这些指令,仅仅用ret或者call跳转到这些指令所在地址即可(ret和call要的是指令所在地址,并非指令)

3、关闭标准输出,没有回显时,可以利用magic_gadget来去获取一些我们需要的函数。

4、开启沙箱并且三个文件描述符全关时(意味着orw读取的flag也无法看见),可以用socket+connect将flag发送到这个新开的文件上(毕竟close关闭的仅仅是当前终端的0,1,2)

阅读全文 »

总结:

通过这道题的学习与收获有:

1、学习了格式化字符串漏洞中的%s泄露函数地址原理以及roderick师傅写的Libcbox的用法(其实用法也很简单了),之后就没什么了直接ret2libc就打了。

2、这道赛题最后只有三解… 不过真的很简单,做出来的人很少的原因估计是因为这道题是比赛还有不到两个小时结束,才把正确的程序放出来(之前放的都是错误的…)。

阅读全文 »

总结

通过本题的学习与总结有:

  1. 本题与starctf2018_babystack这题一样,考察的都是篡改TLS中的stack_guard从而绕过canary的检查,因为在2.23和2.27 32位的glibc里面主线程的TLS是位于mmap映射出来的内存,并且位置固定并不随机。而本题可以通过数组索引无限制,而在mmap映射出来的区域精准的修改某个内存,这就给了篡改TLS中的stack_guard的机会
  2. 本题的难点在于之后绕过canary,无法正常的泄露libc地址,从而造成了一定难度,通过学习网上各位师傅的wp,发现本题一共有三种做法,分别是利用magic gadget篡改got表,ret2dl以及攻击IO_FILE。这里我采用的是利用magic gadget篡改got表
阅读全文 »