文本整理了alarm函数在pwn中的一些应用
利用alarm函数获取syscall
在一些题目里,可以利用alarm直接获取到syscall的地址 找个libc文件,然后反汇编看一下alarm的汇编代码
/ (fcn) sym.alarm 33
| sym.alarm ();
| ; XREFS(26)
| 0x000cc200 b825000000 mov eax, 0x25 ; '%'
| 0x000cc205 0f05 syscall ; syscall = sym.alarm + 0x5
| 0x000cc207 483d01f0ffff cmp rax, -0xfff
| ,=< 0x000cc20d 7301 jae 0xcc210
| | 0x000cc20f c3 ret
| | ; CODE XREF from sym.alarm @ 0xcc20d
| `-> 0x000cc210 488b0d617c2f. mov rcx, qword [0x003c3e78] ; [0x3c3e78:8]=0
| 0x000cc217 f7d8 neg eax
| 0x000cc219 648901 mov dword fs:[rcx], eax
| 0x000cc21c 4883c8ff or rax, 0xffffffffffffffff
\ 0x000cc220 c3 ret
? 发现alarm中就有一个syscall指令,而syscall和alarm的偏移地址是0x000cc205 - 0x000cc200 = 0x5。因此我们可以得到syscall的实际地址 = alarm的实际地址 + 0x5
利用题目可以参考XCTF-008-Recho
利用alarm给eax赋值
alarm()用来设置信号SIGALRM 在经过参数seconds 指定的秒数后传送给目前的进程. 如果参数seconds 为0, 则之前设置的闹钟会被取消, 并将剩下的时间返回。利用这个特性,我们可以给eax赋值,例如第一次调用时alarm(10),隔了五秒后调用alarm(0)时,就会返回5,即给eax赋值5。之后可以利用int80的gadgets调用fopen函数。
利用的题目可以参考2016 CTF warmup
|