목록Wargame/pwnable.xyz (49)
Pwnstar
간단한 heap overflow문제이다. 보호기법은 카나리와 nx bit만 걸려있다. 메인함수부터 분석해보자 int __cdecl main(int argc, const char **argv, const char **envp) { signed int v3; // eax int i; // [rsp+Ch] [rbp-14h] int j; // [rsp+10h] [rbp-10h] int v7; // [rsp+18h] [rbp-8h] int v8; // [rsp+1Ch] [rbp-4h] setup(*(_QWORD *)&argc, argv, envp); while ( 1 ) { while ( 1 ) { print_menu(); v3 = read_int32(); if ( v3 != 1 ) break; write_nam..
거의 다 풀어놓고 너무 오랫동안 헤멘 문제이다. iape 문제의 버전2 문제라는데 코드 흐름 자체는 비슷하다. 요 문제는 다행히 iape처럼 파이는 안걸려 있다ㅋㅋㅋ main int __cdecl main(int argc, const char **argv, const char **envp) { __int64 savedregs; // [rsp+10h] [rbp+0h] setup(); puts("PvP - Programmatically vulnerable Program"); while ( 1 ) { print_menu(); read_int32(); switch ( (unsigned int)&savedregs ) { case 0u: return 0; case 1u: if ( dword_6026A8 ) shor..
로직버그 문제이다. 보호기법 전부 걸려 있음. 이전 문제가 바이너리가 너무 복잡하게 구성되어 있어서 이번문제도 살짝 걱정했는데 복잡하지 않아서 다행이었다. main int __cdecl main(int argc, const char **argv, const char **envp) { __int64 savedregs; // [rsp+10h] [rbp+0h] setup(*(_QWORD *)&argc, argv, envp); init_login(); puts("Web bookmarks."); while ( 1 ) { print_menu(); read_long(); switch ( (unsigned int)&savedregs ) { case 0u: return 0; case 1u: printf("Password..
어우 워게임에서 이렇게 복잡한 바이너리는 정말 오랜만인 것 같다. 함수들이 정말 많은데, 다행히도 문제에서 친절하게 함수 이름이나, 변수 이름들을 명시해놔서 그나마 수월했다. 그럼에도 이 많은 함수들을 전부 볼 엄두가 안나서 바이너리를 실행해보면서 입력을 받는 부분들이 있는 함수들만 추려서 분석을 진행해 보았다. 그러다보니 꽤 수월하게 취약점을 발견했는데, void __cdecl do_skill_change() { Player *player; // [rsp+0h] [rbp-70h] signed __int64 destSkill; // [rsp+8h] [rbp-68h] signed __int64 isAttack; // [rsp+18h] [rbp-58h] char buf[64]; // [rsp+20h] [rb..
FSOP 문제이다. 코드는 짧은데, 파일 구조체에 대해 공부를 해보고 난 후 푸는 것을 추천한다. 보호기법은 nx bit만 걸려 있다. 사실 보호기법은 크게 문제가 되지는 않는다. 그리고 이 문제의 설명을 보면 libc 2.23환경이라고 적혀 있는데, 내가 문제푸는 환경이랑 달라서 디버깅에 조금 문제가 있어 사진은 따로 첨부하지 않겠다. IDA int __cdecl main(int argc, const char **argv, const char **envp) { setup(*(_QWORD *)&argc, argv, envp); printf("> "); read(0, &input, 0x404uLL); fclose(&input); return 0; } input 전역변수에 0x404만큼 값을 입력받을 수 있..
독특한 방법으로 leak을 해야하는 문제였음 보호기법은 전부 걸려있다. main int __cdecl main(int argc, const char **argv, const char **envp) { signed int v3; // eax char v5; // [rsp+10h] [rbp-30h] unsigned __int64 v6; // [rsp+38h] [rbp-8h] v6 = __readfsqword(0x28u); setup(*(_QWORD *)&argc, argv, envp); puts("Message taker."); printf("Message: "); _isoc99_scanf("%s", &v5); getchar(); while ( 1 ) { while ( 1 ) { print_menu(); p..
결론부터 말하면 훼이크였다. uaf 문제가 아니었음. 그렇다고 내가 uaf를 계속 시도하는 뻘짓을 한것은 아니었다. xyz 문제들에서는 언인텐이 많이 보여서... 근데 문제 이름이 uaf라고 해놓고 uaf로 푸는게 아니었다니 뭔가 배신감이 드는 문제이다. 무슨 뻘짓을 그리 했는지는 곧 설명하겠다.... 카나리와 NX bit가 걸려 있음. main int __cdecl main(int argc, const char **argv, const char **envp) { char *v3; // rsi const char *v4; // rdi __int64 savedregs; // [rsp+10h] [rbp+0h] setup(*(_QWORD *)&argc, argv, envp); initialize_game();..
아우 푸는데 너무 오래 걸린 문제이다. 보호기법은 카나리 빼고 전부 걸려있다. IDA int __cdecl main(int argc, const char **argv, const char **envp) { char *v3; // rsi const char *v4; // rdi int v5; // eax char s; // [rsp+10h] [rbp-400h] setup(*(_QWORD *)&argc, argv, envp); v3 = 0LL; v4 = &s; memset(&s, 0, 1024uLL); while ( 1 ) { while ( 1 ) { print_menu(v4, v3); v5 = read_int32(); if ( v5 != 1 ) break; printf("data: "); v3 = (cha..