목록Wargame/pwnable.xyz (49)
Pwnstar
더러운 거북이라는 문제인데....이전에 풀었던 것과 비슷한 형태의 문제이다. 뭐였더라... RELRO가 안걸려 있어 got overwrite가 가능. 코드는 참 짧다. int __cdecl main(int argc, const char **argv, const char **envp) { __int64 v3; // rax char *s; // [rsp+0h] [rbp-10h] __int64 v6; // [rsp+8h] [rbp-8h] setup(*(_QWORD *)&argc, argv, envp); puts("Dirty Turtle Off-RoadS"); printf("Addr: "); v3 = get_val(); printf("Value: ", v3); v6 = get_val(); if ( v6 ) *(..
영웅 공장....이다. PIE빼고 전부 걸려있다. int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { signed int v3; // eax setup(*(_QWORD *)&argc, argv, envp); while ( 1 ) { while ( 1 ) { printMenu(*(_QWORD *)&argc); v3 = getInt(*(_QWORD *)&argc); if ( v3 != 2 ) break; usePower(*(_QWORD *)&argc); } if ( v3 > 2 ) { if ( v3 == 3 ) { deleteHero(); } else { if ( v3 == 4 ) { puts("goodbye!"); ex..
이전의 UAF와 달리 진짜 uaf문제이다. got overwrite가 가능하다. 메인함수부터 천천히 분석해보자 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 savedregs; // [rsp+10h] [rbp+0h] setup(*(_QWORD *)&argc, argv, envp); puts("Note taking 102."); while ( 1 ) { print_menu(); read_int32(); switch ( (unsigned int)&savedregs ) { case 0u: return 0; case 1u: make_note(); break; case 2u: edit_note(); break; case 3u:..
이전의 executioner 문제와 거의 비슷한 문제인데, 다른 부분이 두 가지가 있다. 우선 보호기법은 전부 걸려있음. 이전 문제와 다른 점은 unsigned __int64 solve_pow() { unsigned int buf; // [rsp+8h] [rbp-18h] int v2; // [rsp+Ch] [rbp-14h] int v3; // [rsp+10h] [rbp-10h] int fd; // [rsp+14h] [rbp-Ch] unsigned __int64 v5; // [rsp+18h] [rbp-8h] v5 = __readfsqword(0x28u); fd = open("/dev/urandom", 0); if ( fd == -1 ) { puts("Can't open /dev/urandom"); exit..
오랜만의 bof문제이다. 이전의 xyz 문제들은 전부 함수의 이름들이 남아 있었는데 이 문제는 남아있지 않다. 그래서 주요 함수들만 이름을 바꿔 놓았음. 보호기법은 전부 걸려있다.(최근 문제들 대부분 그랬던것 같은데...) 구조 분석을 해 보자. __int64 __fastcall main(__int64 a1, char **a2, char **a3) { sub_CB8(); puts("Yolo yada yada - Play with me!"); puts("==========================================="); play(); return 0LL; } 메인함수는 별 거 없고, play라는 함수부터 보자 unsigned __int64 sub_EAD() { size_t v0; // ra..
주말의 마지막 문제이다. 이틀동안 많이 풀었어야 하는데...3문제밖에 못풀었다. 올클까지 빠르게 달려보자. 이번에도 보호기법이 전부 걸려있다. 문제풀기에 앞서 플래그를 base64로 미리 encode된 형태로 만들어 놔야 하는데 이게 32바이트여야 가능하다 대충 base64 encoding해주는 사이트 들어가서 "A"를 24개 encoding해주면 32바이트 짜리 base64코드가 나오니 참고하면 문제 푸는데에 도움이 된다. main int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // eax __int64 v4; // [rsp+0h] [rbp-20h] size_t n; // [rsp+8h] [rbp..
요거는 문제 자체는 되게 쉬운데...내 로컬 환경 탓인지 너무 이상하다ㅋㅋㅋ 보호기법은 전부 걸려있다. unsigned __int64 solve_pow() { unsigned int buf; // [rsp+8h] [rbp-18h] int v2; // [rsp+Ch] [rbp-14h] int v3; // [rsp+10h] [rbp-10h] int fd; // [rsp+14h] [rbp-Ch] unsigned __int64 v5; // [rsp+18h] [rbp-8h] v5 = __readfsqword(0x28u); fd = open("/dev/urandom", 0); if ( fd == -1 ) { puts("Can't open /dev/urandom"); exit(1); } buf = 0; read(fd..
음 요 문제는 바이너리 자체가 복잡하진 않았는데 코드짜는게 복잡했다. 그래서 노가다로 했음... 나중에 또 언급하겠지만 풀고 다른 분들 라업 봤는데 또한번 내가 빡대가리란 걸 깨닳았음. 보호기법은 다 걸려 있음... main int __cdecl main(int argc, const char **argv, const char **envp) { size_t v3; // rax unsigned int v5; // [rsp+0h] [rbp-10h] unsigned int v6; // [rsp+4h] [rbp-Ch] unsigned __int64 v7; // [rsp+8h] [rbp-8h] v7 = __readfsqword(0x28u); setup(*(_QWORD *)&argc, argv, envp); motd..