marriage

2019年第三届红帽杯线上赛wp

限于喜欢 提交于 2019-12-03 10:16:03
2019年第三届红帽杯线上赛wp PWN three IDA打开之后,函数名都是 sub_xxx ,然后通过nc官方部署的程序(或本地在程序所在目录创建flag文件后),获得程序中会出现的字符串定位到了重要函数,我用的是字符串 Maybe is good 。 贴出来一下重要函数对应的内存地址: 函数名(已重命名) 内存地址 main 0x08048CA8 load_flag 0x080488C5 Maybe_is_good 0x0804897E main_method 0x08048B5C 四者结构如图: load_flag 里面需要加载flag文件,如果没有就exit,也就是一开始无法本地打开原因。 Maybe_is_good 里面没有特别的,关键在main_method,先贴出完整代码(以重名部分函数&注释) gdb调试:‘very much’ 后输入 ‘aaa’,‘tell me’ 后输入 ‘bbbbbbbbbbb······’。可以看到eax被写入了’aaa’,ecx被写入了’bbbbbbbbbbbbbbbbbbb····’ 然后就是第22行代码,看不懂就查汇编,对应的汇编是 call eax 。就是当eax是函数来调用。结合前面的eax会被覆写为输入值,就可以进行 ROP 。 攻击大致流程如下: eax被覆写为payload1 写入payload2 call eax

hdu 3416 Marriage Match IV(最短路+bfs+dfs)

匿名 (未验证) 提交于 2019-12-02 23:32:01
题意: 给定n个点,m条单向边,每条边有花费,给出起点a和终点b,求a到b的最短路径的方案数,其中任意一条边至多只能出现在一个方案中。若两个点之间有多条边,算作不同的边。 题解: 做完之后百度了一下,发现清一色的最短路+最大流,想了想最后确实是最大流,然而只知道一点理论、不会网络流的本菜鸡确实不会这个做法,只能YY出别的解法。。。 首先,我们建两个图,一个正向的,一个反向的。 在正向的图上以点a为起点做最短路,得到点a到每个点的最短路。 在反向的图上以点b为起点做bfs,将满足dis[v]==dis[u]-w的边全部用队列存起来,得到一个由队列存起来的只包含了最短路径的边的图。 在队列存好的图上做多次dfs,每次都以点b为起点。 dfs时将路径出队列,若最后能到点a,则返回true,否则不断尝试直到无路可走,返回false。若dfs返回true,则方案数+1,重新dfs。 bfs和计算方案数时的时间复杂度为O(m),最短路采用的是堆优化的迪杰斯特拉,时间复杂度O(mlogm),因此总的时间复杂度为O(mlogm) 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define db double #define m_p make_pair #define p_b push_back