攻防世界新手题
RE
insanity
https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5079&page=1
原来flag还能长"9447{This_is_a_flag}"这样…
logmein
https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5078&page=1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| .text:0000000000400707 loc_400707: ; CODE XREF: main+177↓j .text:0000000000400707 lea rdi, [rbp+s] ; s .text:000000000040070B movsxd rax, [rbp+var_54] .text:000000000040070F mov [rbp+var_88], rax .text:0000000000400716 call _strlen .text:000000000040071B mov rdi, [rbp+var_88] .text:0000000000400722 cmp rdi, rax .text:0000000000400725 jnb loc_4007AC .text:000000000040072B lea rdi, [rbp+var_20] ; s .text:000000000040072F movsxd rax, [rbp+var_54] .text:0000000000400733 mov [rbp+var_90], rax .text:000000000040073A call _strlen .text:000000000040073F mov rdi, [rbp+var_90] .text:0000000000400746 cmp rdi, rax .text:0000000000400749 jb loc_400754 .text:000000000040074F call sub_4007C0 .text:0000000000400754 ; --------------------------------------------------------------------------- .text:0000000000400754 .text:0000000000400754 loc_400754: ; CODE XREF: main+119↑j .text:0000000000400754 movsxd rax, [rbp+var_54] .text:0000000000400758 mov cl, [rbp+rax+var_20] .text:000000000040075C mov [rbp+var_55], cl .text:000000000040075F mov eax, [rbp+var_54] .text:0000000000400762 cdq .text:0000000000400763 idiv [rbp+var_2C] .text:0000000000400766 movsxd rsi, edx .text:0000000000400769 mov cl, byte ptr [rbp+rsi+var_28] .text:000000000040076D mov [rbp+var_56], cl .text:0000000000400770 movsx edx, [rbp+var_55] .text:0000000000400774 movsx edi, [rbp+var_56] .text:0000000000400778 xor edx, edi .text:000000000040077A mov cl, dl .text:000000000040077C mov [rbp+var_57], cl .text:000000000040077F movsxd rsi, [rbp+var_54] .text:0000000000400783 movsx edx, [rbp+rsi+s] .text:0000000000400788 movsx edi, [rbp+var_57] .text:000000000040078C cmp edx, edi .text:000000000040078E jz loc_400799 .text:0000000000400794 call sub_4007C0 .text:0000000000400799 ; --------------------------------------------------------------------------- .text:0000000000400799 .text:0000000000400799 loc_400799: ; CODE XREF: main+15E↑j .text:0000000000400799 jmp $+5 .text:000000000040079E ; --------------------------------------------------------------------------- .text:000000000040079E .text:000000000040079E loc_40079E: ; CODE XREF: main:loc_400799↑j .text:000000000040079E mov eax, [rbp+var_54] .text:00000000004007A1 add eax, 1 .text:00000000004007A4 mov [rbp+var_54], eax .text:00000000004007A7 jmp loc_400707
|
ps:
CQD:
把edx的所有位设成eax最高位的值
在最后的“jmp loc_400707”实现循环
跳转到sub_4007C0后,就显示输入的密码错误
由于不会分析了 就 看了伪代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| v9 = 0; strcpy(v8, ":\"AL_RT^L*.?+6/46"); v7 = 28537194573619560LL; v6 = 7; printf("Welcome to the RC3 secure password guesser.\n", a2, a3); printf("To continue, you must enter the correct password.\n"); printf("Enter your guess: "); __isoc99_scanf("%32s", s); v3 = strlen(s); if ( v3 < strlen(v8) ) sub_4007C0(v8); for ( i = 0; i < strlen(s); ++i ) { if ( i >= strlen(v8) ) ((void (*)(void))sub_4007C0)(); if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) ) ((void (*)(void))sub_4007C0)(); } sub_4007F0(); }
|
其中v7可以转换为16进制再转换成字符串,所以v7在运算时变为"haramb"
得到flag的代码:
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> #include<string.h> int main(){ char k1[]=":\"AL_RT^L*.?+6/46"; char k2[]="harambe"; int a=7; char s[50]; for(int i=0;i<strlen(k1);i++){ s[i]=(char)(*(k2+i%a)^k1[i]); } puts(s); }
|
彦林学长给的一题
题在这边:easyYM
看了他的wp
嗯…感觉自己知道 有flag的那块地方没有被调用,但一方面是不知道是哪些函数跟flag有关(通过查看字符串)(后来用ida打开发现,放在main函数里,刚开始就跳过了) ,另外就是没有想到od设置某处为新eip的功能
装Pwntools
1 2 3 4
| apt-get update apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential pip install --upgrade pip pip install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple/
|
数据结构
多重链表
- 广义表
广义表中的元素可以是一个单元素,也可以是另一个表。
1 2 3 4 5 6 7 8
| struct Glist{ int tag; union { Element Type Data; Glist anlist; } Glist Next }
|
广义表即为一个多重链表
多重链表中结点的指针域有多个(如anlist和Next),包含两个指针域的链表不一定是多重链表(如双向链表)
堆栈
数据对象集:有穷线性表
操作集:堆栈的长度、堆栈元素
- 生成长度为MaxSize的空堆栈
- 判断堆栈是否满了
- 将一个元素压入堆栈
- 判断堆栈是否为空
- 删除并返回栈顶元素
栈的顺序存储结构由一个一位数组和一个记录栈顶位置的变量top组成
顺序存储
入栈
1 2 3 4 5 6 7
| if(s->top==MaxSize-1){ printf("堆栈满"); } else{ s->data[s->top]=item; (s->top)++; }
|
出栈
1 2 3 4 5 6
| if(s->top=-1){ printf("堆栈空"); } else{ data=s->data[(s->top)--]; }
|
链式存储
用一个单链表,称作链栈
top在链表的头结点,头结点里不存放其他元素
入栈
出栈
记得free()
队列
只能在一端插入(入队),在另一端删除(出队)
先进先出
顺序存储
一个一维数组+一个记录头元素的变量front+一个记录尾元素的变量rear
front指向第一个元素的前一个位置
- 循环队列
当front和rear相等时为空(或相等)(解决方案:加入一个额外标记;使用n-1个空间)
链式存储
存在单链表中,front和rear指针分别指向头和尾