분류 전체보기
[pwnable.xyz] child write up
[pwnable.xyz] child write up
2020.08.09Analytic checksec으로 검사 해보니 처음보는 것이 있는데 `fortify: enabled` 이다. 이건 처음봐서 뭔지 모르겠다... 문제 푸는데는 지장 없는듯..? `create_child()` 함수를 보면 18세 이하만 조건을 통과 할 수 있는데, 조건을 통과하면 `child`의 구조체가 만들어진다. void create_child(){ __printf_chk(1, "Age: ") int64_t rax_1 = read_int32() uint64_t rax_7 if (rax_1:0.d u> 0x12) rax_7 = puts("Not a child.") else void* rax_2 = malloc(0x20) *(rax_2 + 0x18) = sx.q(rax_1:0.d) *(rax_2 + 8) ..
Universe Blog
Universe Blog
2020.08.09https://github.com/Universe1122 Universe1122 - Overview [Patchstack Alliance] [TeamH4C]. Universe1122 has 37 repositories available. Follow their code on GitHub. github.com https://twilight-princess-750.notion.site/Who-am-I-047259a12251420a95244c0472f64535
[pwnable.xyz] car shop write up
[pwnable.xyz] car shop write up
2020.08.09Analytic `Full RELRO` 이기 때문에 GOT overwrite를 할 수 없다. `buy()` 함수를 보면 사용자가 선택한 자동차가 메모리 공간에 저장된다. 이때의 메모리 구조를 보면 아래와 같다. `0x603260` ~ `0x6032af`: 사용자가 `buy()` 함수를 호출하면 `car`라는 구조체의 chunk가 만들어짐 `0x603260`: 자동차 이름을 저장한 주소 `0x603268`: 자동차 이름의 크기 `0x603270`: 다음 청크(`car`)의 주소 `0x603278`: 이전 청크(`car`)의 주소 `0x603290`: 자동차의 이름 gdb-peda$ x/10gx 0x603260 0x603260: 0x0000000000603290 0x0000000000000003 0x6032..
[pwnable.xyz] words write up
[pwnable.xyz] words write up
2020.08.08Analytic 아래 사진은 사용자 정의 함수 목록이다. fill_letters(), fill_numbers(), fill_handles(), fill_words() 함수들은 특별한 기능은 없고 사용자 선택에 따라 문장을 만들어 출력하는 함수 이다. 하지만 fill_handles() 함수를 제외한 나머지 함수들은 만들어진 문장으로 초기화 하여 생성하지만, fill_handles() 함수는 로직 에러로 초기화를 하지 않고 문장을 추가한다. 코드로 자세히 설명하자면, 사용자가 select1 값이 2가 아니고 select2 값이 6이상이면 문장을 초기화 하지 않는다. 이 로직 에러로 문장을 계속 추가 할 수 있게 된다. 문장이 저장되는 메모리 공간은 아래와 같다. 문장이 저장되는 시작 부분은 변수 a인 0x6..
[pwnable.xyz] notebook write up
[pwnable.xyz] notebook write up
2020.08.07바이너리 파일을 분석하여 c로 나타내면 아래와 같다. void make_note(){ printf("size: "); int size = read_int(); void* addr = malloc(0x38); *(addr + 0x30) = malloc(size); *(addr + 0x8) = size; *addr = &get_size(); printf("Title: "); readline(addr + 0xc, 0x1f, 0xa); printf("Note: ") readline(*(addr + 0x30), size, 0xa); *data_602300 = addr; } void edit_note(){ int addr = *data_602300; if(addr != 0){ addr = *(*data_602300..
[pwnable.xyz] nin write up
[pwnable.xyz] nin write up
2020.08.07이번 문제는 UAF 관련 문제이다. 해당 바이너리에는 아래와 같은 보안 장치가 설정되어 있다. 바이너리를 c코드로 변환하면 아래와 같다. void hash_gift(arg1, arg2){ int result1 = 0; int result2 = 0; int count = 0; while(true){ if(count >= int(arg2/2)) break; result1 = result1 + *(arg1 + count); count++; } for(int i = int(arg2)/2; i 0x2; eax = eax >> 0x1f; edx = edx - eax; eax = edx; eax = eax 사용자가 입력한 값 (크기: 사용자가 입력한 길이에 따라 다름) 0x603280 ==> invite_reznor..
[pwnable.xyz] note v2 write up
[pwnable.xyz] note v2 write up
2020.08.05해당 바이너리에는 아래와 같은 보안 기법이 적용되어 있다. 또한 아래 사진처럼 여러개의 사용자 정의 함수들의 존재하는 것을 볼 수 있다. 사용자 정의 함수들 중 아래 make_note() 함수를 보자. 기본적으로 0x28 만큼 공간을 할당하고, 사용자로 부터 크기를 입력받아 공간을 할당한다. 만약 *(addr + 0x20) 에 값이 들어가 있으면 공간을 할당 하지 않는다. void make_note(){ if(count
InCTF2020 - coins write up
InCTF2020 - coins write up
2020.08.02MISC 분야의 문제이다. nc로 접속하면 아래와 같이 문제가 출력이 된다. 문제만 봐도 한눈에 이해가 간다. python으로 4자리를 찾는 코드를 작성하면 아래와 같다. string 패키지로 문자열을 나열한 다음 for문 4개를 이용해 알맞은 4자리 값을 찾은 후 sendline() 함수로 값을 보낸다. from pwn import * import string import hashlib context.log_level = "debug" p = remote("34.74.30.191", "1337") line = p.recvline().replace("\n", "") line = line.split(" ") length = len(line[0][line[0].find("(")+1 : line[0].find..
[TSG 2020 CTF] beginner's pwn write up
[TSG 2020 CTF] beginner's pwn write up
2020.07.14몇일간 이 문제 푼다고 고민하고 롸업 보면서 내걸로 만들려고 했지만.. 어려웠다. 덕분에 새로운 접근법을 알게 되었다. Attack tech FSP Buffer Overflow GOT Overwrite ROP Return to csu Analyze 이 문제는 총 2개의 함수가 존재하는데, main() readn() 이렇게 2개가 존재한다. main() 함수에서 readn() 함수로 입력을 받고, scanf() 함수로 한번더 입력을 받는데 여기서 FSB 공격이 가능하다. 또한 buffer overflow도 canary 우회만 된다면 가능하다. readn() 함수는 syscall() 을 이용하여 read() 함수를 호출한다. 이때 사용자가 입력한 마지막 값이 0xa 이면 rax에 그 주소를 저장하고 해당 값..
[bug bounty] - 나의 첫번째 hackerone 버그 바운티
[bug bounty] - 나의 첫번째 hackerone 버그 바운티
2020.05.27Weakness Information Exposure Through an Error Message Summary hackerone 에서 bug bounty를 하고 있었다. 어떤 사이트를 대상으로 공격을 했는지는 말 할 수는 없지만, 나의 첫 버그 바운티 보고는 에러를 이용한 서버 정보 노출이었다. 타킷 사이트의 파라미터는 아래와 같다. cartCode=00000652597083&CSRFToken=4ffccfb9-76fc-48aa-9625-a93a2ff31bb4 필자는 SQLI 공격을 하려고 시도 했지만 WAF에 차단되었다. cartCode=00000652597083||sleep(/*&CSRFToken=*/1)#4ffccfb9-76fc-48aa-9625-a93a2ff31bb4 WAF 차단 조건이 특정 문자..
[HackCTF] - [Misc] 탈옥 write up
[HackCTF] - [Misc] 탈옥 write up
2020.04.26python jail 문제이다. nc로 접속하면 아래와 같이 python 코드가 출력이 되고 사용자에게 입력을 받는다. 입력받은 문자열은 필터링을 거치고 exec() 함수로 실행이 된다. python3 버전 이므로 __builtins__ 모듈을 사용하여 내장 객체를 이용할 수 있다. 아래와 같이 dir() 함수로 __builtins__ 모듈에 포함되어 있는 메소드를 볼 수 있다. __dict__ 를 사용하여 dictionary 타입으로 출력 할 수 있다. dictionary 타입으로 변경을 했기 때문에, 위에 나와있는 키 값을 이용하여 payload를 완성 시킨다. dictionary 타입으로 변경을 하지 않았을 때는, list 타입으로 return이 되므로 indexing 으로 사용하려는 모듈의 위치를..
[pwnable.xyz] - dirty tultle write up
[pwnable.xyz] - dirty tultle write up
2020.04.15pwnable.xyz 34번째 문제 dirty turtle 이다. Analyze 이번 문제의 사용자 정의 함수를 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/34_Dirty turtle $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start get_val handler main setup win checksec으로 바이너리에 적용된 보안 기법을 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/34_Dirty turtle $ checksec --file=challenge RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORT..
python으로 사이트에 있는 url crawler tool 개발
python으로 사이트에 있는 url crawler tool 개발
2020.03.30소스코드는 github에서 볼수 있습니다. Lactea98/URL-crawler URL crawler. Contribute to Lactea98/URL-crawler development by creating an account on GitHub. github.com 사용자가 입력한 URL에 요청을 보내어 URL 만 파싱하여 결과를 html로 출력합니다. 개발 목적은 취약한 URL 이 있는지 분석을 위해 개발 되었습니다. # Used module 사용된 모듈은 아래와 같습니다. requests bs4 argparse fake_useragent json urlparse # How to use 실행 방법은 아래와 같이 명령어를 입력하면 Crawler 를 시작합니다. python3 urlcrawler.py -..
python 으로 http request smuggling tool 만들기
python 으로 http request smuggling tool 만들기
2020.03.30소스 코드는 github 에서 볼 수 있으니 참고 바란다. 모든 기능은 완성되지 않았지만, 사용하는데 문제는 없을 것이다. Lactea98/smuggler.py HTTP request smuggling tools. Contribute to Lactea98/smuggler.py development by creating an account on GitHub. github.com http request smuggling 도구를 만들기 위해 어떻게 하면 취약함을 알 수 있는가를 portswigger 에서 공부했다. 또한 이미 짱짱해커들이 만들어 놓은 payload 를 참고해서 나만의 툴을 개발하게 되었다. Module 이 툴을 사용하기 위해 아래의 모듈이 필요하다. import requests import a..
Paypal에서 발견된 HTTP Request Smuggling - 실습 환경 구축
Paypal에서 발견된 HTTP Request Smuggling - 실습 환경 구축
2020.03.22요즘 http request smuggling 공격에 대해 몇일간 공부 중이다. 몇달 전에 이 공격을 처음 접하게 되면서 이 공격에 대해 매우 흥미를 느꼈다. http request smuggling 공격에 대해 portswigger 라는 홈페이지에서 자료를 통해 공부를 했고 실습 환경을 만들어 공부 해보면 어떻까 라는 생각을 해서 이렇게 글로 정리를 해본다. 이 실습 환경 만든다고 개고생 했다.. 삽질한 것을 바탕으로 아래 글에 나와 있는데로 진행할 경우 성공할 것이라고 생각한다. 필자가 참고한 사이트는 아래 Reference에 있으니 참고 하길 바란다. # 1. Setting Practice Environment HTTP request smuggling 공격 환경을 만들기 위해서는 사용자와 메인 서버..
[pwnable.xyz] badayum write up
[pwnable.xyz] badayum write up
2020.03.10pwnable.xyz 30번째 문제이다. 해당 바이너리의 사용자 정의 함수를 보면 존재 하지 않았다... ubuntu:~/environment/ctf/pwnable.xyz/30_badayum $ func challenge nm: challenge: no symbols 그래서 gdb로 main 함수를 찾고 play(?) 함수와 win() 함수를 찾았다. 이를 c코드로 나타내면 아래와 같다. /* main: 0x555555554ead play??: 0x555555554d48 win: 0x555555554d30 */ long play(){ int tmp_1 = 0; // rbp-0x74 int tmp_2 = 0; // rbp-0x78 while(tmp_1 edx = 0x1f4e9d7e) edx = edx 0x..
[pwnable.xyz] Hero Factory write up
[pwnable.xyz] Hero Factory write up
2020.03.10pwnable.xyz 33번째 문제이다. Analyze 해당 바이너리에서 사용자 정의 함수들을 보면 아래와 같다. ubuntu:~/environment/ctf/pwnable.xyz/33_Hero Factory $ func challenge __libc_csu_fini __libc_csu_init _fini _init _start createHero crossfit deleteHero floss getInt hadouken handler main printFnc printHero printMenu printSuperPowers setup usePower win wrestle zeroHero gdb로 바이너리를 분석하여 c코드로 나타내면 아래와 같다. (분석 환경이 gdb 밖에 없는 내 자신이 대단..) v..
[zer0pts 2020 CTF] - notepad write up
[zer0pts 2020 CTF] - notepad write up
2020.03.09zer0pts 2020 CTF 문제 중 pwnable 분야의 notepad 이다. 문제 사이트에 접속하면 아래와 같이 출력이 된다. 소스코드는 아래와 같다. import flask import flask_bootstrap import os import pickle import base64 import datetime app = flask.Flask(__name__) app.secret_key = os.urandom(16) bootstrap = flask_bootstrap.Bootstrap(app) @app.route('/', methods=['GET']) def index(): return notepad(0) @app.route('/note/', methods=['GET']) def notepad(nid..
[zer0pts 2020 CTF] - Can you guess it? write up
[zer0pts 2020 CTF] - Can you guess it? write up
2020.03.09zer0pts 2020 CTF 문제 중 pwnable 분야의 Can you guess it? 이다. 위 문제의 소스 코드를 보면 아래와 같다.
[zer0pts 2020 CTF] hipwn write up
[zer0pts 2020 CTF] hipwn write up
2020.03.09zer0pts 2020 CTF 문제 중 pwnable 분야의 hipwn 이다. 문제 파일을 다운로드 하면 chall, main.c 파일이 존재한다. main.c 코드 내용은 아래와 같다. #include int main(void) { char name[0x100]; puts("What's your team name?"); gets(name); printf("Hi, %s. Welcome to zer0pts CTF 2020!\n", name); return 0; } ubuntu:~/environment/ctf/zer0pts/pwn/hipwn $ checksec --file=chall RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fort..
Aero 2020 CTF write up - aerofloat
Aero 2020 CTF write up - aerofloat
2020.03.03Aero 2020 CTF 문제 중 pwnable 분야의 Aerofloat 문제이다. 대회 당일에는 풀지 못했지만, 롸업을 보고 재 도전 후 풀수 있게 되었다. Analyze 해당 문제의 바이너리 안에 사용자 정의 함수는 아래와 같다. ubuntu:~/environment/ctf/Aero CTF 2020/pwn/Aerofloat $ func aerofloat main menu read_buf read_int gdb로 문제 바이너리를 분석해서 c로 나타내면 아래와 같다. void menu(){ puts("1. Set rating"); puts("2. View rating list"); puts("3. View porfile info"); puts("4. Exit"); printf("> "); } int re..
[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 = "+-/*..