목록분류 전체보기 (101)
ipwn
보호기법 canary만 걸려있음, 32bit binary 분석 그냥 orw만 열어주고 나머지 syscall 다 닫음 + 입력받은 shellcode 실행한다. 걍 orw shellcode박으면 풀림.
보호기법 아무 보호기법 X, 32bit binary 분석 write syscall로 "Let's start CTF:"라는 문자열 출력 후 read syscall로 현 esp부터 0x3c만큼 값을 입력 받음. vuln : 입력은 0x3c만큼 받는데 ret하기 전에 올려주는 스택은 겨우 0x14 vector : 0. stack주소 leak.(스택에 뿌려져있는 포인터 값을 이용. 즉 uninitialized stack으로 leak)1. shellcode주소로 ret을 덮음. (read syscall 때 스택에 shellcode를 뿌려준 후 ret overwrite)2. shell.
그냥 요즘 블로그를 잘 안했고, 워게임 문제만 풀면서 공부했다. 그냥 이렇게 블로그를 운영하기도 좀 그렇고, 요즘 블로그에 글 안쓰니까 공부고 뭐고 아무것도 안하는 사람 같다. 일단 지금 생각해놓은 건 오늘 근황 글 하나 올려놓고 시험 끝난뒤에 다 못썼던 Blind ROP 글 마저 쓴 뒤, 워게임들(pwnable.tw가 전부긴 함) 풀면서 내가 이건 유익했다! 라고 느꼈던 것들 라업? 그냥 기법 설명같은 거? 뭐 그런 거 끄적끄적 적으려고 한다. 블로그 포스팅 안하면서 느낀 건 공부한 걸 기록 안하니까 다 까먹는듯. 근 몇 달 간 근황 -1. BOB 떨어졌다. 아 이건 떨어지면서 느낀건데 일단 나는 무턱대고 개발이고 뭐고, 기본 지식도 없이 바로 포너블을 시작해서, 그리고 포너블만 하려하고 나머지는 내가..
FSB(Format String Bug) 필요한 친구가 있다고 하여 일단 brop보다 우선적으로 작성하게 됐다. fsb는 format string을 사용하는 함수 딴에서 인자 전달을 확실히 하지 않았을 경우에 발생하는 취약점이다. 가장 먼저 포맷 스트링이 무엇인지 알아보자. 자세한 설명은 생략하겠다. 하지만 이 표에서도 설명이 되어있지 않은 포맷 스트링이 두 가지 존재한다. 바로 "%n"과 "%hn"이라는 포맷스트링인데, 이 포맷스트링은 현 (esp + 4 + 포맷스트링에 따라 더해질 byte수)가 가리키고 있는 값을 주소로 인식하고 이전에 출력했던 byte수 만큼 그 주소값에 대입을 하겠다는 포맷스트링이다. 이 두 포맷스트링의 차이점은 %n같은 경우에는 4byte 메모리 공간을 가진 주소로 인식해서 4..
바로 소스코드를 보자. #include #include #include #include #include #include #include unsigned long long rdtsc(){ asm("rdtsc");} char* slow_memcpy(char* dest, const char* src, size_t len){ int i; for (i=0; i= 64){ i = len / 64; len &= (64-1); while(i-- > 0){ __asm__ __volatile__ ( "movdqa (%0), %%xmm0\n" "movdqa 16(%0), %%xmm1\n" "movdqa 32(%0), %%xmm2\n" "movdqa 48(%0), %%xmm3\n" "movntps %%xmm0, (%1)\n"..
이번에 올릴 라업은 leg문제이다. 보면 어셈이랑 C코드 준다. 한 번 파일 열어서 읽어보자. #include #include int key1(){ asm("mov r3, pc\n");}int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\n" "pop {r6}\n" );}int key3(){ asm("mov r3, lr\n");}int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (key1()+key2(..
원래도 공부했던 거 정리하고 머리도 정리하고 그러려고 했던거긴 한데 더 원래 의도에 맞게 글을 다시 써야겠다 애초에 지금 글을 안쓴지 2개월이 넘어서 뭘 공부했는지도 모르겠고 더 나아가서 공부를 했는지도 모르겠다. 목표 설정도 일단 간단하게나마 해놔야겠다. 목표 :pwnable.kr rookiss 올클 및 지금까지 푼 거 전부 라업 작성(toddler's bottle은 공개 rookiss는 보호로)(현 toddler's bottle 올클, rookiss는 5개 품) pwnable.tw 200위권 내에 진입 위에거 다 하면 코드엔진 풀기 시작하기 이제 바로 지금까지 푼 거 라업좀 작성하러 가야겠다.
이 문제는 진짜 진짜 진짜 진자(진자운동 아님ㅎ)쉽다. int __cdecl main(){ int result; // eax int buf; // [esp+0h] [ebp-18h] void *ptr; // [esp+4h] [ebp-14h] int v3; // [esp+8h] [ebp-10h] unsigned int v4; // [esp+Ch] [ebp-Ch] v4 = __readgsdword(0x14u); ptr = 0; v3 = 0; setvbuf(stdout, 0, 1, 0); while ( 1 ) { sub_8048624(); puts("your choice:"); read(0, &buf, 4u); result = buf; switch ( buf ) { case 1: if ( ptr ) { puts..
이번에 푼 문제는 betting문제이다. codegate본선 가서 풀었던 문제인데 예선의 베라보다 쉽다. 왠지 엄청 어려울줄 알고 한 문제라도 풀면 기적이라 생각하고 풀었었다 암튼 분석을 해보자. 보아하니 64bit바이너리에, 카나리, NX가 걸려있다. int __cdecl main(int argc, const char **argv, const char **envp){ unsigned int v3; // eax unsigned int v4; // eax unsigned int v6; // [rsp+4h] [rbp-6Ch] int v7; // [rsp+8h] [rbp-68h] int v8; // [rsp+Ch] [rbp-64h] int v9; // [rsp+10h] [rbp-60h] int v10; // ..