Writeup: 32c3ctf

forth

forth 直接能跑system1

S" sh" system

gurke

pickle 在 unpickle 的时候会执行对象的 __reduce__ 方法2。用 eval 把 __main__.flag.flag 打进 stderr 就行了。

Gist: cubarco/e46eb03e1cd06046d130

teufel

这题的 bin 不大,里面的 gadgets 很少,但是给了 libc. 思路就是先 leak 出保存在栈中的 rbp, 然后 offset 到 system。

这个 offset 要先在本机确定后三位(16 进制), 然后跑个脚本,用 0x1000 的步长去爆破服务器上的 offset. 我的办法是先找__stack_chk_fail, 原因是这个函数不需要参数就能输出。

offset.py

Gist: cubarco/569fd814a29d8ef988e1

exp.py

Gist: cubarco/569fd814a29d8ef988e1

吐槽

~~readme 的 flag 居然是文件名… ~~不过LIBC_FATAL_STDERR_这个环境变量确实是以前没见过的。

update 2016-01-24: 关于 readme 这道题,之前以为 flag 是文件名,做 ZCTF 的 guess 时3,回来看才发现原来是把argv[1]改掉了,蛮有意思。

@rickyz 的 sandbox 解法4蛮有意思,居然想到争抢修改系统调用参数。直接改/proc/self/mem来改变程序流也是第一次见。


  1. Execute a system command#forth ↩︎

  2. Pickling and unpickling extension types ↩︎

  3. Writeup: ZCTF ↩︎

  4. Index of /~ricky/32c3/sandbox/ ↩︎