刷题记录reverse3
攻防世界reverse
answer_to everthing文件无法在我的电脑上运行拖入exe,无壳,拖入64位IDA,main函数F5反汇编跟进not_the_flag翻译一下题干提示了解到sha1加密
第一遍试的大写不正确,第二遍改成小写后正确故flag为flag{80ee2a3fe31da904c596d993f7f1de4827c1450a}
re1-100拖入exe后拖入64位IDA找到主函数F5反汇编前面是对&bufParentRead[1]的开头十个赋值,后面&bufParentRead[31]是对倒数十个赋值,但是后面顺序又乱掉了:strncmp(bufParentRead, “{daf29f59034938ae4efd53fc275d81053ed5be8c}”, 42uLL)看见{daf29f59034938ae4efd53fc275d81053ed5be8c}这一串就猜测肯定跟flag有点关系所以中间一定有改变,跟踪一下中间的confuseKey(bufParentRead, 42)函数:前面比较多东西,但是这次我忽然看到后面的关键了,如截图所示 ...
刷题记录crypto
攻防世界crypto
Railfence附件为ccehgyaefnpeoobe{lcirg}epriec_ora_g发现为栅栏密码通过查找学习知道了这是W型栅栏密码那么有一种叫做WWW的变种1 2 3 4 5 6 # key=3 Rail-fence Cipher1 . . . 5 . ↘ ↗ ↘. 2 . 4 . 6 ↘ ↗. . 3 . . . ↘ ↗结果为 1 5 2 4 6 3PS:WWW型的加密密钥就不只能是字符串长度的因子,小于其长度的任何一个数都可能是其key值,所以第一步也是确定密钥。本题密钥为5用在线W型栅栏解密得到flag为cyberpeace{railfence_cipher_gogogo}
幂数加密附件为8842101220480224404014224202480122题目中说答案为八位大写数字所以要把文件中的数字分为8组,按0位间隔正好8组
88421 0122 048 02244 04 0142242 0248 0122
23 5 12 12 4 15 14 ...
system()函数
函数原型包含在头文件 “stdlib.h” 中
int system(const char *command)
函数描述C 库函数 int system(const char *command) 把 command 指定的命令名称或程序名称传给要被命令处理器执行的主机环境,并在命令完成后返回。
函数返回值命令执行成功返回0,执行失败返回-1。
函数功能执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名。另,在windows系统下参数字符串不区分大小写。
说明:在windows系统中,system函数直接在控制台调用一个command命令。在Linux/Unix系统中,system函数会调用fork函数产生子进程,由子进程来执行command命令,命令执行完后随即返回原调用的进程。附录一些system()函数的参数及实现的功能表格里的内容可以通过 system(“HELP”);语句获取。
sha1算法
sha1算法又名哈希算法
简介SHA-1(Secure Hash Algorithm 1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
实现步骤消息填充(Message Padding)步骤一: 数据填充(Append Padding Bits)SHA-1是按照分块进行处理的,分块长度为512bit, 大多数情况下,数据的长度不会恰好满足是512的整数倍,因此需要进行「padding」到给定的长度。「填充规则」: 原始明文消息的b位之后补100…, 直到满足b + paddingLength % 512 = 448, 那如果b % 512在[448, 512(0)]之间呢,则在增加一个分块,按照前面的规则填充即可。
长度填充之前说了,需要满足b + paddingLength % 512 = 448, 那么对于最后一个分块,就还剩512 - 448 = 64 bit 这剩下的64bit存放的是原始消息的长度,也就 ...
刷题记录reverse2
攻防世界reverse
srm-50拖入EXE,无壳,拖入32位IDAWINMAIN(xxx)函数F5反汇编双击跟进DialogFuncstrcpy(Source, “Registration Success!\nYour flag is:”)后的内容就是flag,快捷键R将数字转换成字符串即CXZA9bd7mGq94gc8按顺序排列后得到CZ9dmq4c8g9G7bAX,即为flag
Mysterious拖入exe,无壳,拖入32位IDA找到WinMain(x,x,x,x) F5反汇编双击跟进_WinMain@16_0,跟进DialogFunc,进入sub_401090找到well done 所在的基本块,条件是v10 == 123 && v12 == 120 && v14 == 122 && v13 == 121,注意到在该基本块的开头调用了strcpy函数将flag 赋值给Text,同时下面也有一些对Text拼接字符串的操作,看起来这个Text保存的就是flag。观察Text的赋值,除了v5,其它的都是已知的字符,需要解出v5的值 ...
itoa函数
定义itoa 为c语言的一个函数。itoa 函数是一个广泛应用的,从非标准扩展到标准的C语言。它不能被移植,因为它不是标准定义下的C语言,但是,编译器通常在一个不遵循程式标准的模式下允许其通过header ,因为它是一个从逻辑对应到标准库的函数。itoa 取整数输入值,并将其转换为相应进制数字的字符串。
功能把一个整数转换为字符串
用法itoa(i ,num ,10 );i —- 需要转换成字符串的数字num —- 转换后保存字符串的变量10 —- 转换数字的基数(即进制)。10就是说按10进制转换数字。还可以是2,8,16等等你喜欢的进制类型返回值:指向num这个字符串的指针
注意事项itoa() 函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用的基数(进制)。在上例中,转换基数为10,就意味着以10为转换进制。10:十进制;2:二进制…itoa 并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。标准库中有sprintf,功能比这个更强,用法跟printf类似:char str[25 ...
幂数加密
二进制幂数加密法何为幂数加密二进制幂数加密通过二进制的几次方表示字母的序号来对信息加密。由二进制转换成十进制的时候,还可以表示成2的N次方的形式。由于英文字母只有26个字母。只要2的0、1、2、3、4、5次幂就可以表示31个单元。通过用二进制幂数表示字母序号数来加密。例如明文: d o n o t p u l l a l l y o u r e g g s i n o n e b a s k e t字母序号:4 15 14 15 20 16 21 12 12 1 12 12 25 15 21 18 5 7 7 19 9 14 15 14 5 2 1 19 11 5 20由于4=2^2 所以D加密过之后是2;15=2^0+2^1+2^2+2^3所以O加密后是0123。同理得到上述明文的加密后的密文密文:2 0123/123 0123 24/4 024 23 23/0 23 23/034 0123 024 14/02 012 012 014/03 123 /0123 123 02/1 0 014 013 02 24空格表示字母的间隔,“/”表示单词的间隔
二进制幂数加密转换表
...
栅栏密码&W型栅栏密码
栅栏密码定义所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)
加密原理①把将要传递的信息中的字母交替排成上下两行。②再将下面一行字母排在上面一行的后边,从而形成一段密码。③例如:明文:THE LONGEST DAY MUST HAVE AN END加密:1、把将要传递的信息中的字母交替排成上下两行。T E O G S D Y U T A E N NH L N E T A M S H V A E D2、 密文:将下面一行字母排在上面一行的后边。TEOGSDYUTAENN HLNETAMSHVAED解密:先将密文分为两行T E O G S D Y U T A E N NH L N E T A M S H V A E D再按上下上下的顺序组合成一句话明文:THE LONGEST DAY MUST HAVE AN END
解密代码传统栅栏密码的密钥是密文长度的因数。如密文长度为n,加密密钥为x,则有n%x==0。且解密密钥即为n/x。代码:
...
刷题记录reverse
攻防世界reverse
maze拖入exe
发现无壳并拖入64位IDAF5反汇编‘R’键将数字转换成字符串可以知道控制方向键的分别为“O”,“o”,“.”,“0”判断分别代表什么方向:左减右加,上减下加O左移 o右移 .上移 0下移判断迷宫的x轴和y轴所以迷宫的起点就是(0,0)
sub_400690函数中是a2+a3*8,即a3表示行,a2表示列a3 通过edx传递a2 通过esi传递行×8?再去看这个字符串,发现是64位,正好就是8×8双击asc_601060查看字符串用记事本整理得迷宫图形
******
* * *
*** * **
** * **
* *# *
** *** *
** *
********
*是边界,空格是通路,#号是终点。O是左移,o是右移,0是下移,.是上移得到flag为nctf{o0oo00O000oooo..OO}
Shuffle拖进exe,无壳,拖入32位IDAF5反汇编
没想到直接看到flag,SECCON{Welcome to the SECCON 2014 CTF!},提交竟然是对的
dmd-50拖入EXE,无壳,拖入6 ...
IDA中的IDC脚本编写笔记
IDC首先,什么是IDC?IDC是IDA中支持的一门与C语言类似的语言,但是它是解释型的,并不是编译型的,于此同时IDC还融合了一些python中的元素以方便一些内容的处理。
在IDA中按下【shift+F2】可调出脚本编译器
IDC语句IDC支持C中的语言,除了switch
IDC表达式IDC几乎都能支持C语言中的操作运算表达(加减乘除、判等家族),但是明确说明不支持+=。在进行操作运算的时候,只有操作中存在64bit的操作,那么其他操作也会编程64bit的。
IDC预定义符号IDC有一些符号是提前定义好了的,其内容和含义如下:
_NT_ IDA is running under MS Windows
_LINUX_ IDA is running under Linux
_MAC_ IDA is running under Mac OS X
_UNIX_ IDA is running under Unix (linux or mac)
_EA64_ 64-bit version IDA
_QT_ ...