pwn (96) 썸네일형 리스트형 HackCTF/ Unexploitable 4 IDA로 main함수 봤을때는 클났다 싶었는데 Unexploitable #3보다 쉬웠다 근데 내 로컬에서 분석했을때는 bss영역에 실행권한이 없었는데 다른 분들 풀이 보니까 있었다.... dreahack에서도 이거와 관련한 글이 있어서 나중에 하나하나 봐야겠다 https://dreamhack.io/forum/community/1612 왜 validator 문제는 푸는 사람에 따라 bss에 실행권한이 다를까? 대충 이 이야기의 시작은, 오래전 작년 12월로 넘어간다.. 오픈 카톡 채팅방에 정도비님이 물어보셨다. 내 컴퓨터에서는 bss 섹션에 X가 없는데, 다른 사람 라이트업을 보니 b… dreamhack.io write-up 단순한 stack buffer overflow가 터진다 어.... 난이도가 급격히.. SROP 보호되어 있는 글입니다. memory leak 후 할만 한거 보호되어 있는 글입니다. dreamhack / tiny backdoor 보호되어 있는 글입니다. jon9hyun's secret 카나리랑 PIE가 안 걸려있다 바이너리는 static compiled이고 stripped 되어있다... 이거본 순간 그대로 IDA 끄고 자러 갈 뻔했다 최대한 알아먹을 수 있게 함수명을 적어놓았다 main함수에서 힙 영역에 데이터를 입력받고 top_secret파일의 데이터를 출력한다 운이 좋았는지 처음에 심볼이 다 죽어있어서 strace로 실행시켜보는 과정에서 main함수 이전에 flag을 open하는걸 확인했다 from pwn import * context.log_level = "debug" p = remote("ctf.j0n9hyun.xyz", 3031) #p = process("./j0n9hyun_secret") #gdb.attach(p) payload = b"A" * 0x138 payload +=.. UAF 바이너리를 열어보면 노트를 추가, 삭제, 출력 기능이 있다 add_note함수에서는 먼저 8만큼의 힙을 할당받은 뒤 노트에 문자열이 될 힙을 원하는 크기만큼 할당받는다 print_note_content함수 주소와 문자열이 있는 청크의 주소는 처음 할당된 청크에 저장되고 이 청크 주소를 notelist에 저장한다 notelist에서 원하는 인덱스의 노트를 삭제시킬 수있다 (add_note에서 할당된 청크를 free시킨다) 문자열 데이터가 저장된 청크를 먼저 free시키고 add_note에서 처음 할당받은 청크를 free시킨다 notlist에 저장된 청크에 있는 함수를(print_note_content) 호출한다 del_note함수에서 할당된 청크를 free할때 notelist의 주소를 비워주지 않기 때문에.. mistake 전체 코드 아래 더보기 더보기 #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Password OK\n"); system("/bin/cat flag\n"); } else{ printf("Wrong Pass.. leg c코드와 ARM 어셈블리 코드가 주어진다 (아래 더보기 참고) 더보기 #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push{r6}\n" "addr6, pc, $1\n" "bxr6\n" ".code 16\n" "movr3, pc\n" "addr3, $0x4\n" "push{r3}\n" "pop{pc}\n" ".code32\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()+key3()) == key .. 이전 1 ··· 6 7 8 9 10 11 12 다음