목록Wargame/HackCTF (37)
Pwnstar
rtc...지금이야 return to csu 라는 기법인걸 알지만 풀 때까지만 해도 그런 기법 자체를 몰라서 언인텐으로 풀었던 문제이다. 다른 분들 라업 보면 인텐으로 푸신 분들은 많아서 언인텐 라업을 써 보려고 한다. 우선 64비트 바이너리이고, NX bit가 걸려있다. IDA int __cdecl main(int argc, const char **argv, const char **envp) { char buf; // [rsp+0h] [rbp-40h] setvbuf(stdin, 0LL, 2, 0LL); write(1, "Hey, ROP! What's Up?\n", 0x15uLL); return read(0, &buf, 512uLL); } 문제는 간단하다 저렇게 메인 함수가 하나 있고, buf의 사이즈는..
you are silver라는 문제이다 64비트 바이너리이고, NX bit만 걸려있다. IDA int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [rsp+0h] [rbp-30h] int v5; // [rsp+28h] [rbp-8h] int v6; // [rsp+2Ch] [rbp-4h] setvbuf(stdout, 0LL, 2, 0LL); v6 = 50; puts("Please enter your name"); fgets(&s, 46, stdin); printf(&s, 46LL); v5 = get_tier(v6); printf((const char *)v5); return 0; } fgets로 입력을 받아 bof는 힘..
BOB 시작해서 얼마 안되고 풀었던 문제인데 어케 풀었는지 기억이 안나서 다시 풀면서 라업을 써보려고 한다. main함수 int __cdecl main(int argc, const char **argv, const char **envp) { vulnerable_function(); write(1, "Hello, World!\n", 14u); return 0; } 요래 되어있다 vulnerable_function이 메인인듯 ssize_t vulnerable_function() { char buf; // [esp+0h] [ebp-88h] return read(0, &buf, 256u); } buf의 사이즈는 136바이트인데 입력으로 256바이트를 입력할 수 있으니 rop 가젯 짜기에는 충분하다. onesho..
pwning 문제에 대한 라업을 작성하기 전에 uaf에 대해서 먼저 써 보려고 한다. 힙 문제를 그래도 좀 풀어봤는데 아직도 감이 잘 안온다... 문제 이름대로 uaf를 이용하여 푸는 문제일 것이다. NX bit와 카나리가 걸려있고, 32비트 바이너리이다. IDA int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // eax char buf; // [esp+8h] [ebp-10h] unsigned int v5; // [esp+Ch] [ebp-Ch] v5 = __readgsdword(0x14u); setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); while ( 1..
gift라는 문제이다. 32비트 바이너리이고, NX만 걸려있다. IDA로 디스어셈블 된 메인 함수를 보자. 보니까 binsh와 system의 주소를 주는데, binsh 주소는 /bin/sh가 들어있는 주소가 아닌 그냥 bss 주소이다. 버퍼의 크기는 132바이트인데 처음엔 fgets로 입력을 받고, 이후에 gets로 입력을 또 한번 받는다. printf(&s)를 보아하니.. fsb도 가능할 것 같지만? 안될것이다 왜냐하면 fsb에는 시간이 많이 걸리는데 60초 이내에 문제를 풀어야하기 때문에 시간이 부족할 것이다. 그러니 그냥 bof를 사용하도록 하자. 처음 입력받고 그 다음 입력으로 페이로드를 보내야한다. 이후로는 별 어려움이 없다 gets함수로 bss영역에 /bin/sh 문자열을 넣으면 되고, sys..
흠 푸는데 참 여러가지 삽질을 많이 해봤던 문제이다. 보호기법은 NX bit만 걸려있다. IDA setvbuf는 뭐 딱히 볼 것도 없고 getegid라는 함수는 처음 보는 함수이다. 현 프로세스의 effective group id를 출력해주는 함수라고 하는데 음 크게 신경쓰지 않아도 될 것 같다. look_at_me 함수를 보자. 이게 핵심일 것 같으니. 음?? gets로 입력을 받으니 그냥 단순한 bof함수가 아닌가??? 했는데 쉘을 획득하기에 많은 문제가 있었다. 보면 statically linked라고 하는데 모든 함수가 동적으로 링킹되는게 아니고 정적으로 링킹이 되서 모든 함수가 이미 컴파일?? 되어있다. 그래서 got를 출력할 수 없으니 libc leak도 불가능하다. 그렇다고 system 함수..
rtl core라는 문제이다 왠지 rtl world의 업그레이드 버전일 것 같은 느낌이 든다. 32비트 바이너리이고, NX bit만 걸려있다. IDA로 핵심 함수들을 살펴보자. int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+Ch] [ebp-1Ch] setvbuf(_bss_start, 0, 2, 0); puts(&::s); printf("Passcode: "); gets(&s); if ( check_passcode((int)&s) == hashcode ) { puts(&byte_8048840); core(); } else { puts(&byte_8048881); } return 0; } passcode를 ..
랜덤 키라는 문제이다. 이전의 문제들과 마찬가지로 64비트 바이너리이고 NX bit만 걸려있다. IDA로 보자. int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { unsigned int v3; // eax int v4; // [rsp+0h] [rbp-10h] int v5; // [rsp+4h] [rbp-Ch] unsigned __int64 v6; // [rsp+8h] [rbp-8h] v6 = __readfsqword(0x28u); setbuf(_bss_start, 0LL); v4 = 0; v3 = time(0LL); srand(v3); v5 = rand(); puts("==========================..