2020/02
[pwnable.xyz] catalog write up
[pwnable.xyz] catalog write up
2020.02.28pwnable.xyz 26번째 catalog 문제이다. Analyze 문제의 바이너리에 사용자 정의 함수를 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/26_catalog $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start edit_name handler main print_menu print_name read_int32 setup win write_name gdb로 바이너리를 분석하여 c로 나타내면 아래와 같다. /* gdb-peda$ x/50gx 0x0000000000602280 0x602280 : 0x0000000000603260 0x0000000000000000 0x602290 : 0x0..
[pwnable.xyz] message write up
[pwnable.xyz] message write up
2020.02.25pwnable.xyz 20번째 message 문제이다. keyword: buffer overflow keyword: canary leak Analyze ubuntu:~/environment/ctf/pwnable.xyz/20_message $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start get_choice handler main print_menu setup win gdb로 바이너리를 분석해서 c로 나타내면 아래와 같다. #include void print_menu(){ puts("Menu:\n1. Edit message.\n2. Print message.\n3. Admin?"); } int get_choice(){ char a = ..
[pwnable.xyz] rwsr write up
[pwnable.xyz] rwsr write up
2020.02.25pwnable.xyz 22번째 rwsr 문제이다. keyword: environ 변수로 stack 주소 Leak Analyze 해당 바이너리의 사용자 정의 함수는 아래와 같다. 이번에는 so 파일까지 주워젔다. ubuntu:~/environment/ctf/pwnable.xyz/22_rwsr $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start handler main print_menu read_ulong setup win gdb로 바이너리를 분석해서 c로 나타내면 아래와 같다. #include void print_menu(){ printf("Menu:\n 1. Read\n 2. Write\n 0. Exit\n> "); } int read..
[pwnable.xyz] bookmark write up
[pwnable.xyz] bookmark write up
2020.02.25pwnable.xyz 24번째 문제 bookmark 이다. Analyze 해당 바이너리의 사용자 정의 함수는 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/24_bookmark $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start create_url handler init_login main print_menu read_long setup win gdb로 분석하여 c로 나타내면 다음과 같다. #include void init_login(){ int fd = open("/dev/urandom"); if(fd == -1){ exit(1); } read(fd, bm+256, 0x8); close(fd); } ..
[pwn] - pwntools 로 PIE base 구하기
[pwn] - pwntools 로 PIE base 구하기
2020.02.23바이너리에 PIE가 걸려 있다면, 디버깅 할때 주소가 랜덤으로 바뀌어 breakpoint를 걸 수 가 없다. 하지만 PIE base를 구할 수 있다면, 주소가 랜덤으로 바뀌어도 breakpoint를 걸 수 있다. 바로 아래 코드가 중요하다. pie_base = p.libs()["바이너리 절대 경로"] 간단한 예를 보면 다음과 같다. from pwn import * context.terminal = ['tmux', 'splitw', '-h'] context.log_level = 'debug' p = process("./challenge") e = ELF("./challenge",checksec=False) pie_base = p.libs()["/home/ubuntu/environment/ctf/pwnabl..
[pwn] - environ 변수로 stack leak 하기
[pwn] - environ 변수로 stack leak 하기
2020.02.23environ 변수를 이용해 stack leak 를 하는 방법이다. 이 공격을 하기 위해 다음과 같은 가정이 필요하다. libc base 주소를 알고 있다. 임의의 주소를 leak 할 수 있다. gdb-peda$ p 0x00007ffff79e4000 + 0x861a5c8 $2 = 0x7fffffffe5c8 gdb-peda$ p environ $3 = (char **) 0x7fffffffe5c8 gdb-peda$ x/gx $rsp 0x7fffffffe4d8: 0x00007ffff7a05b97 gdb-peda$ p 0x7fffffffe5c8 - 0x7fffffffe4d8 $4 = 0xf0 gdb-peda$ libc base address: 0x00007ffff79e4000 environ offset: 0x8..
[pwnable.xyz] uaf write up
[pwnable.xyz] uaf write up
2020.02.21pwnable.xyz 19번째 문제 uaf 이다. 이번 문제는 Use After Free 문제 인줄 알았지만, 전혀 아니었다... Analyze 해당 문제의 바이너리를 분석하면 아래와 같이 사용자 정의 함수가 많을 것을 알 수 있다. ubuntu:~/environment/ctf/pwnable.xyz/19_uaf $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start calc delete_save edit_char handler initialize_game main print_menu read_int32 save_game setup win gdb 로 바이너리를 분석해서 c로 나타내면 아래와 같다. #include void initialize..
[pwnable.xyz] fspoo write up
[pwnable.xyz] fspoo write up
2020.02.21pwnable.xyz 14번째 문제 fspoo 이다. Analyze 문제의 바이너리에서 사용자 정의 함수를 보면 아래와 같다. ( "_" 함수가 있는걸 롸업 쓰면서 알게 되었다...) ubuntu:~/environment/ctf/pwnable.xyz/14_fspoo $ func challenge _ __libc_csu_fini __libc_csu_init __stack_chk_fail_local __x86.get_pc_thunk.ax __x86.get_pc_thunk.bx __x86.get_pc_thunk.dx _fini _init _start handler main setup vuln win 사용자 정의 함수 중 자세히 봐야 할 것들은 main, vuln, win 이다. gdb 로 해당 바이너리를 분석..
[pwnable.xyz] Game write up
[pwnable.xyz] Game write up
2020.02.15pwnable.xyz 13번째 Game 문제이다. ubuntu:~/environment/ctf/pwnable.xyz/13_game $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start edit_name find_last_save handler init_game main play_game print_menu read_int32 save_game setup win 해당 바이너리 안에는 사용자 정의 함수가 많은 것을 볼 수 있다. Analyze 필자의 분석 환경은 매우 열악해서(IDA를 쓸 수 없는 상황..) gdb를 통해 해당 바이너리를 분석해서 c로 바꾸어 보았다. #include char saves[40]; char ops = "+-/*..