LitCTF-pwn
比赛的时候比较忙,当时没怎么看题,做了一道签到就下了,结束后打了一下,最后一个pwnpwn没看懂什么意思,等复现了
test_your_nc
签到题

shellcode
题目直接执行shellcode

只允许使用read+open,测信道爆破flag

1 | from pwn import * |
onlyone
详细的就参考这篇文章
https://xz.aliyun.com/news/17965
这道题也就是模仿的当时强网拟态的那道题目,基本上一摸一样,利用一次fmt打一次指针跳板
劫持返回地址为main, 从而实现多次fmt的机会,然后将printf的返回地址+8的地方改为ogg,最后将printf的返回地址改为ret,触发ogg,getshel
l
1 | from pwn import* |
master_of_rop
题目:

只存在一个gets,没有pop_rdi,如何去控制rdi呢,这里引入一种比较新颖的手法,ret2gets,在 gets 返回后,rdi 通常指向 _IO_stdfile_0_lock,这是一个 libc 中的可写地址。攻击者可以利用这一点,通过 ROP 链再次调用 gets,向 _IO_stdfile_0_lock 写入任意数据,具体原理会另外写一篇文章分析了,这里直接用了
第一个paylaod
1 | payload = b'a'*(0x20)+p64(0) |
控制返回地址为gets,往_IO_stdfile_0_lock写入(b”A” * 4 + b”\x00”*3),然后会泄露出TLS,由此计算偏移即可得到libc地址,通知控制返回地址为main,为了第二次打ROP链
这里可以直接用libc中的pop_rdi,也可以用ret2gets的paylaod,这里不能直接输入/bin/sh,调试发现第二个/被转换为. ,可以直接用$0或者
1 | p.sendline(b"/bin" + p8(u8(b"/")+1) + b"sh") |
1 | from pwn import* |