ciscn_2019_s_1
考察了off by null
考察了off by null
赛题WP
赛题WP
这次比赛放了三道pwn,做起来还是蛮吃力的,shellcode那题还是经过师傅们提示才做出来的,R()P这题到比赛结束也没有做出来。通过这次比赛感觉自己对于汇编中的gadget理解和利用还是有写不足,在此写下wp记录一下解题的过程。
赛题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)
通过本题的学习与总结有: