Easy Tutorial on Linklab for NJUPT-CS

阅读本文你需要的工具:IDA(没有也可以), XELFviewer

前言

今天真的很头疼,头疼的要命。

Phase1

可以看一下phase1.o文件。

可以发现它将我们的s字符串首地址给了rdi作为puts的一参使用。我们可以去看一下这个字符串常量是什么样

这边可以直接用IDA改 但是考虑到可能有人没办法搞到所以我们使用开源的XELFviewer

也是看到了这一串字符串 只需要将它改为自己的学号就好了 选中这一堆然后右键 编辑十六进制 我这里举例为B23000000 记得把右上角的只读关掉

之后进终端

gcc -no-pie -o lb1 main.o phase1.o
./lb1

Phase2

看一下phase2.o文件。懒得看直接f5吧。

我们可以看到它把这个yhijersvq字符串copy到了v2处 然后下面这个putchar其实是去一个未定义的大小为256的char数组IqLUAJPrUp中各个字母对应的位置去挨个找 可以从下图看到char数组的Ndx是5

结合题目 我们需要先把它改为UND弱符号再写一个patch文件去定义强符号然后link。

先改phase2.o 看一下.symtab里 找到了这个符号 把它的Ndx改为0(UND)。

我们可以看到变为了UND

然后定义 举例为B23000000

保存 然后操作如下

gcc -c phase2_patch.c
gcc -no-pie -o lb2 main.o phase2.o phase2_patch.o
./lb2

Phase3

一个简单switch的判断 不让我们改text 那我们可以改跳转表。cookie是XUNJETIAY,然后通过它们与A的偏移去跳转表找对应的地址执行代码 v1的数字是ascii。

举个例子 是B23000000我们可以直接改rodata偏移,只需要我们改一下需要跳转的位置就好

A-Z对应是0-25

将字母替换为对应的位置:

X U N J E T I A Y → 23 20 13 9 4 19 8 0 24

那么他的意思就是从头到尾 去跳转表对应的位置去执行一个打印字符的指令。举个例子比如我们第一个需要打印的是字母'B' 我们看一下rodata段的第23个。是0xfb

很不幸他会跳到fb 最后打印字符@

这时候我们就可以尝试修改跳转的位置 例如我们要跳到B 先找找

在0x77 我们只需要改为0x77就可以

改完进终端执行

gcc -no-pie -o lb3 main.o phase3.o
./lb3

可以看到第一个被我们改成了B 之后的自己慢慢找就可以改了。

希望可以帮到大家。