- 博客(176)
- 问答 (1)
- 收藏
- 关注
原创 windows程序设计基础--学习记录
这是第一个Windows程序,Winmain函数必须写这些参数,不能省略。MessageBox函数有MessageBoxA和MessageBoxW,分别使用ANSI和Unicode字符集。就是提示找不到main的入口。在子系统这里选择窗口。就可以正常编译运行程序了。
2024-07-17 23:43:55
255
原创 ISCC2024 winterbegins
首先,反汇编第12行那个函数sub_7FF783BFCB20,里面一大堆奇奇怪怪的语句,不知道是干嘛的。我们会从输入的字符串转变过来的数字,然后根据这些数字找到Str对应的位置,找到相应的汉字赋值。sub_7FF783BE11E0,这个函数就是对你输入的字符串,重复的字母会压缩成一个,并且后面跟着一个重复次数。例如,CC会变成C2,BBB会变成B3,也可以动调玩玩看。sub_7FF783BE1840这个函数,就是把字符的数字转成数字,如果是字母,也做一些转换,具体的转换可以自己看看,非常简单。
2024-06-13 22:13:39
329
原创 decert.me挑战 ERC20
transferFrom这个函数被msg.sender调用,用于_from给_to转账。也就是说,msg.sender可以用_from给msg.sender的额度,给_to转账。一开始我以为这个是扣_to的额度,但并不是的,扣的是调用者msg.sender的额度。简单来说,就是msg.sender可以使用_from给自己的额度,然后给任意一个地址(_to)转账。ERC20的难点我觉得主要在于transferFrom这个函数。
2024-05-18 22:44:21
217
原创 ISCC re Badcode
这部分就很有意思了,一开始我也以为是垃圾代码,毕竟对输入的v17根本没影响。然后这里是秘钥和密文。注意,这的密钥是小端序的,也就是说把字节拼起来的时候要注意是小端序顺序。(涉及到数组都可以考虑小端序)这里的密文也是小端序,但放进去解密的时候要按照IDA反汇编的顺序放,不然解密会出错,等到最后打印字符的时候再按小端序处理。这样子的话,可以猜测sub_311B60是string的[ ]。然后扔进IDA按F5。这题学习了好多知识。这些估计是垃圾代码。
2024-05-05 23:11:27
146
原创 wtf.academy Solidity 101 入门 控制流测试答案
测试题目并不能完整加载出来,换了几个浏览器都不行,不知道是不是坐着忘记上传图片了,就剩这一个测试,空着很不爽,把答案试出来了。答案是:CBAEDABC。
2024-05-05 00:15:07
111
原创 整数提升——记录
这个主要是调试程序的时候发现的,我试图将一个小于32位的值(例如一个8位或16位的值)赋值给一个int类型的变量时,这个值通常会被扩展到一个32位的整数。这个过程叫做整数提升。被扩展的同时,符号位也会被扩展,所以会在前面填充很多1以保持数值的符号不变。因此,调试的时候发现,给char 赋值0xAD,转换为int会变成一个很大很大的值。如果想保留原状,可以加上unsigned int再进行输出,加上unsigned以后就可以阻止符号扩展了。
2024-05-03 17:26:30
76
原创 xyctf ez_rand
可以发现export data之后,数据就是我们熟悉的大端序了。但是,除了我们需要的数据,我们还发现多了三个十六进制数。这三个十六进制数是x86指令的机械码,粘贴之后记得去掉就行。然后有一点是需要注意的,IDA这里显示的数据有可能是小端序的,所以我们需要export data,在菜单栏的Edit按钮下可以找到。核心的代码就是这一部分,只要得到v4的值,也就是随机种子,那就可以把值弄出来了。所以我们需要做的就是爆破随机种子。我们先对v9[0]这里export data。
2024-04-30 15:47:35
198
原创 xyctf 何须相思煮余年
这里就简单了,enc的数据就在这里解密,跟着反汇编的代码反着来就可以了,例如case 0我就-=i, case 1我就+=i,以此类推,就可以弄出flag了。不知道是什么,百度搜了搜前面几个十六进制数,发现是字节码。那就好办了,我们需要做的就是把字节码还原为汇编指令。然后把生成出来的.bin文件拖入IDA,我使用的是32模式(因为我尝试了只有32位模式成功了)。对着00000000这个地址按p,然后ida就会从这里开始的区域分析为函数。我们下载下来文件,看到的是这样的东西。然后就可以按F5反汇编了。
2024-04-29 14:24:18
154
原创 xyctf Debugme 安卓动态调试初次尝试 记录踩过的坑
这是因为动态调试需要程序在设备上运行才能进行,这时我们可以使用安卓系统的真机安装这个程序运行,也可以使用模拟器,这里我使用雷电模拟器。然后,打开Android Killer,把程序拖进去,如果提示反编译失败,那可以尝试更换最新版的apktool,这是因为,题目给的DebugMe程序并不是一个开了调试模式的程序,我们需要做的就是让这个程序变为调试模式的。现在尝试回编译,记得在回编译前ctrl+s保存文件,然后在编译的选项下选择AndroidKiller。然后打开JEB,再次尝试进行调试程序。
2024-04-20 19:18:17
441
原创 acwing 1221 四平方和
题目思路就是建立一个哈希表,记录c2+d2c^2+d^2c2+d2的c、d值,然后查表就可以了#include<iostream>#include<map>using namespace std;const int MAX=5e6+5;int n;pair<int,int> a[MAX];int main(){ cin>>n; for(int i=0;i*i<=n;i++) { for(int
2022-04-08 21:11:15
462
原创 错位排列总结
首先从这个问题开始:有nnn 个人以及 nnn 顶帽子,每个人任意选取一顶帽子,求至少一个人拿对自己帽子的概率。1. 推导记事件AiA_{i}Ai为“第iii个人拿对了自己的帽子”,i∈[1,n]i\in[1,n]i∈[1,n]则所求概率为P(A1∪A2∪......∪An)P(A1 \cup A2 \cup ...... \cup An)P(A1∪A2∪......∪An)由P(A1)=P(A2)=...=P(An)=1nP(A_{1})=P(A_{2})=...=P(A_{n})=\frac{
2022-04-08 14:55:03
1346
原创 AtCoder Regular Contest 084
题目我们考虑如何搜索。很明显,我们以1为起步变成其他数字有两种方法,分别是x+1和x10,x+1是变新数字不进位的方案,进位的时候,我们为什么不从某一个状态10呢?大概思路有了,然后我们要做的就是把状态压缩到k以内,我们可以考虑对每一个x对k取模,为什么可以这么做呢,既然我们只有+和*两种方案,超过k的时候必须要从比k小的状态转移过来,取模并不影响答案,就这么做可以了。#include<cstdio>#include<algorithm>#include<iostrea
2021-11-02 00:11:52
142
原创 acwing 1247
题目其实一开始想对了,就是无论是+负数还是-正数,统统塞进-(xxxxx)里,不用分那么多类情况,归约起来其实就两种情况,有没有负号。#include<iostream>#include<string>#include<cmath>#include<vector>#include<algorithm>#define int long long#define IO ios::sync_with_stdio(false),cin.tie
2021-10-20 11:48:26
89
原创 atcoder regular 111 B
题目可以把这题,每张牌的两个颜色看作图的两个端点(一个颜色一个端点),然后每次取一种颜色,其实就是每条边只能取一个结点,问最后最多能取几个结点。我们可以发现,只要图的连通块,存在一个环,那么这个连通块所有结点都能选上。树的话就只能取n-1个,因为每条边只能选一个结点吗。所以只需要找出所有连通块,对边数和结点数取min就可以了。#include<cstdio>#include<algorithm>#include<iostream>#include<cstr
2021-10-09 10:43:39
107
原创 codeforces 742 div2 E
题目当时没想到区间合并怎么弄,这个题好好学了一次。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<queue>#include<list>#include<bitset>#include<stack&
2021-09-24 14:26:25
79
原创 codeforces global round 16 E
题目思路总体和我想的差不多,就是当时想的有一点问题。做法很简单,就是把树拆开,拆成一个一个bud,然后根据样例可以发现,每一个bud都可以去掉一个叶节点,最无论如何总有一个减不掉的,就这么求就行。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<
2021-09-24 14:15:38
74
原创 openjudge 4132 表达式求值 递归下降
题目以前不想用栈写表达式求值,代码都不想看,现在专门学了编译原理来写一下。原理百度就有了。好久没用openjudge了,这个oj的编译器是真的傻逼。/*#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<queue>#include&
2021-09-23 11:11:28
93
原创 atcoder beginner 214 E
题目这玩意居然还能用并查集来做。首先贪心的想,每个球我们能往左边放就往左边放,那么我们就能尽可能的腾出位置了。那我们怎么知道这个球所能放的最左边的位置呢,我们可以用并查集来维护。设fa[x]为x这个位置能不能放,不能放的话fa[x]将告诉你最左边能放的位置在哪。具体怎么维护看代码就可以了。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include&l
2021-08-26 00:45:43
83
原创 atcoder beginner 200 D
题目首先呢,每个数选与不选,总共有2^n-1种选数方案(因为除去所有不选),题目中给出一个要求,所有数的和%200相同,这个有什么用呢?我们总共2的n-1种选数方案,理论上说我们会有2的n次方-1种结果,那%200,就相当于把这么多结果放到200个盒子里,那我们就可以想到鸽巢原理。所以我们可以直接爆搜,反正最多两百种情况。#include<cstdio>#include<algorithm>#include<iostream>#include<cstrin
2021-08-24 01:12:04
280
原创 codeforces 734 div3 E
题目这题我们用dp,我们可以把状态设为dp[i][j]dp[i][j]dp[i][j]为前i个数字,去除j个以后能满足题目要求的个数。难点就在于吧点数删掉了,应该怎么转移。我们可以想到,我们设某个点的位置为pos,那删除了j个点,新的位置就应该为pos-j,然后就可以转移了。转移方程直接看代码就行。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#inclu
2021-08-17 23:01:41
106
原创 2021-08-03
题目这题主要是采用其他搜索顺序,我们平时是像洪水填充那样搜完一个连通块,但这个不行,我们可以采用每次都找整副图的方法,每次找一个点,然后判这个点是否连通就可以了。这样凑满五个点,重复的话我们可以使用状态压缩判重,就这样就可以写dfs了。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sst
2021-08-03 22:03:45
61
原创 AtCoder Beginner Contest 212 D
题目傻了,其实就像noip2017蚯蚓那题维护就行了。那怎么取最小呢,就用优先队列呀,干嘛一定要用队列呢,那对所有元素add该怎么办呢,那就对所有后面来的元素都减呀,根据相对论,我不动,你减,那不就等于我加了嘛。#include<bits/stdc++.h>#define rep(i,n) for(int i=0;i<(int)n;i++)#define fr first#define sc second#define P pair<int,int>#define
2021-07-31 22:50:31
69
原创 codeforces 611 div3 E
题目首先这题我们要输出两个答案,最大和最小,应该怎么做呢?首先我们考虑最小,我们可以这么想,如果某个位置xxx有人,那么[x,x+2][x,x+2][x,x+2]这三个位置都可以放到x+1x+1x+1位置当中,这样贪心就是最小了。那最大应该怎么办呢,对于某个位置,如果它的位置大于1个人,且左边有空位的话,那就让一个人过去呗,右边同理,能占则占,感觉和D差不多。然后这题就完成了,不懂的看一下代码就差不多懂了。#include<cstdio>#include<algorithm&g
2021-05-12 10:33:19
92
原创 codeforces round 717 div2 D
题目这题一步一步来想,暴力的话我们该怎么做。对于每个区间l,r,我们以r为起点,往左一个一个试,看看当前这个数在划分的区间内是否与区间所有数互质,不互质直接新划分一个区间,否则继续往左找。下面我们考虑怎么加速这个过程,首先就是如何判断某个数x和一堆数(设这堆数的集合为s)是否互质。这个我们可以这么做:设集合s所有数的质因子的集合为ss,然后对x进行质因数分解,看看是不是x的所有 质因数都不在ss里面,是的话就互质,不是就不是互质。然后设dp[i][j]dp[i][j]dp[i][j]为j这个位置,往左
2021-05-10 19:40:31
102
原创 2021年北京理工大学ACM CLUB清明节组队训练赛 G Generator Grid
题目思路很简单,玩玩两个样例大概就知道可以贪心+并查集了,一开始写复杂了,其实代码简单的一匹。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<queue>#include<list>#include<bitset&
2021-04-29 17:31:36
188
原创 buuctf 新年快乐 ESP定律脱壳
查壳,发现是upx壳。我们可以直接使用脱壳机,这里使用ESP定律手动脱壳。打开IDA,发现根本分析不了:把程序拖入x32dbg,点击选项->首选项:至少选择这两个断点,否则不知道停在哪个地方。第一行就是pushad。按F7,进入到下一行,然后发现ESP已经变了。右击ESP的数字,点击在转储中跟随,右击第一行,选择断点,“硬件,存取”,双字。然后按F9继续运行。已经到了popad的位置。继续调试或者根据经验可以发现,00401280就是OEP。点击插件->Sc
2021-04-02 08:51:13
349
转载 idapython 攻防世界 no strings attached
https://blog.csdn.net/weixin_43281394/article/details/112341592
2021-03-31 22:24:22
128
原创 2021 MAR-DASCTF drinksometea
新手第一次见这种题,记录一下压缩包给了一个exe还有一个png.out,那个png.out不知道干嘛用的。查一下exe有无加壳,无,拖入ida进行分析。程序流程不难,就是先从tea.png读入数据,然后经过中间的函数处理,然后把输出输出到tea.png.out。题目要我们做的就是,用那个out文件,还原出png文件进入4010A0函数,发现ida根本分析不了:原来这就是传说中的花指令。看了别的大佬博客才知道,对于00401116,有红色的这行语句按U,然后在Hex-view那里,把那行数据
2021-03-31 22:22:32
685
1
原创 2021 Nepctf worrrrms
这题挺有意思的先是压缩包,一解压就说文件不是压缩文件,不知道干嘛了,重新下载了一个才行。解压后,拖入ida打开,发现是go语言,看不懂。然后百度一下,可以安装插件,IDAGolangHelper,谷歌百度一下就有了,安装好,再去看看。发现Go语言函数名都恢复了,虽然代码一点也不可读,但至少看着稍微顺眼一点点吧……然后找啊找,找了很久,在worrrrms_puzzle_ChkPlz 和worrrrms_puzzle_Gotcha找到了key和word,然后乱试,就把flag搞出来了。由于pysm4
2021-03-29 21:48:51
235
原创 攻防世界——新手区——re1
题目这个嘛,拖进IDA然后F5,找到一个类似字符串常量的东西。然后学到了一招,见到什么xmmword和qword的直接按R就可以让后面的xxxxxxxxh变成字符串了,但是好像顺序有点乱,把他们倒序然后乱搞试多几下就可以了...
2021-03-11 21:42:19
200
原创 atcoder beginner 194 D
题目题解,感觉这题的官方题解比搜到的好多了#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<queue>#include<list>#include<stack>#include<bitset>
2021-03-09 11:02:24
115
原创 atcoder beginner 185 E
题目开始练dp了。设dp[i][j]dp[i][j]dp[i][j]为第一个字符串前i个和第二个字符串前j个,我们只有四种决策,i选j删除,i删除j选,i删除j删除,i选j选,很明显第三种根本没用的,所以我们只选其他三种决策就行。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<string>#include<sstre
2020-12-14 23:12:53
84
原创 牛客练习赛73 C D
题目C首先,这类题肯定就是算贡献的了,那我们应该怎么算呢?首先,mex的值必定为1~n+1里面的数,毕竟它只有n个数。对于每一个可能的mex值,我们可以这么考虑,设这个值为x,那么[1,x−1][1,x-1][1,x−1]的值必须全部选上,x不能选,大于x的数随便选,然后统计答案就可以了。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include&l
2020-12-09 17:11:37
153
原创 牛客巅峰赛第六场 钻石B青铜C
题目设dp[i][j][k]dp[i][j][k]dp[i][j][k]为选了前n个音符且m个重音符,第i个音符是否为重音符,k=1是,0不是。那么就可以直接转移了,注意一点细节,当m=1时,只从m=0转移过来,因为第一个可以随便放的。class Solution {public: /** * * @param n int整型 乐谱总音符数 * @param m int整型 重音符数 * @param k int整型 重音符之间至少的间隔
2020-12-05 01:09:19
91
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人