분류 전체보기 82

[dreamhack] level 1 csrf-2

해당 문제의 목표는 관리자 계정으로 로그인하는 것이다. 문제 분석users = { 'guest': 'guest', 'admin': FLAG}위와 같은 코드가 있기에 id : guest, pw : guest로 로그인 해보니, index 페이지에 Hello guest, you are not an admin 라는 문구가 출력되었다./vuln사용자가 param에 입력한 값을 페이지에 출력해준다./flagparam에 입력한 url로 이동/loginid와pw를 입력하여 로그인 할 수 있는 기능/change_password사용자의 비밀번호를 바꿀수 있는 기능엔드포인트 분석/vuln@app.route("/vuln")def vuln(): param = request.args.get("param", "")..

CTF & Wargame(WEB) 2025.04.13

[dreamhack] level 1 csrf-1

엔드포인트 분석/vuln@app.route("/vuln")def vuln(): param = request.args.get("param", "").lower() xss_filter = ["frame", "script", "on"] for _ in xss_filter: param = param.replace(_, "*") return param유저가 입력한 param 값을 소문자로 바꿔서 param 변수에 저자함. frame, script, on을 필터링하고 해당 키워드들을 *로 변환함. /memo@app.route("/memo")def memo(): global memo_text text = request.args.get("memo", None) if t..

CTF & Wargame(WEB) 2025.04.13

[dreamhack] level 1 xss-2

/vuln사용자가 입력한 값을 출력한다/memo사용자가 memo에 입력한 값을 출력한다./flag사용자가 param에 입력한 Url로 이동한다. 엔드포인트 분석/vuln@app.route("/vuln")def vuln(): return render_template("vuln.html")xss-1과는 다르게 /vuln 페이지에서는 render_template 함수를 사용하여 vuln.html을 띄워준다. render_template 함수는 전달된 템플릿 변수를 HTML 엔티티로 변환하여 전달하기 때문에 xss가 발생하지 않는다. /memo@app.route("/memo")def memo(): global memo_text text = request.args.get("memo", "") ..

CTF & Wargame(WEB) 2025.04.12

[dreamhack] level 1 xss-1

/vuln사용자가 입력한 파라미터대로 출력해준다./memomemo= 에 입력한 값을 그대로 출력해준다./flag전달된 url에 사용자가 접속하도록 한다. /vuln@app.route("/vuln")def vuln(): param = request.args.get("param", "") return paramget 방식으로 param을 이용자에게 입력받고 param의 값을 출력한다. /memo@app.route("/memo")def memo(): global memo_text text = request.args.get("memo", "") memo_text += text + "\n" return render_template("memo.html", memo=memo_text)..

CTF & Wargame(WEB) 2025.04.12

[dreamhack] level 2 basic_rop_x86

문제 분석checksec으로 해당 바이너리에 어떤 보호기법이 적용 되어 있는지 확인해보면 NX와 ASLR이 적용되어 있다. 하지만 카나리는 적용 되어 있지 않다.GDB 분석main 함수를 disassemble 해보면 buf 함수가 ebp-0x44에 저장되어 있는 것을 확인할수 있다. 따라서 0x04 크기의 더미값이 스택에 있다는 뜻이다. 위의 정보를 토대로 스택 프레임 구조를 파악해보면 buf(0x40)dummy(0x04)sfp(0x04)ret(0x04)라는 것을 알 수 있다. 익스플로잇 설계해당 바이너를 익스플로잇 하기 위해 우리는 저번 문제에서 사용하였음 ret2main 기법을 사용해 공격을 진행할 것이다.  from pwn import *p = remote('host3.dreamhack.games'..

[dreamhack] level 2 Return to Library

문제 분석checksec을 통해 어떤 보호기법이 적용 되어 있는지 확인해보면 canary와 NX가 적용되어 있는 것을 확인할 수 있다. 코드 분석#include #include const char* binsh = "/bin/sh";int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@plt'"); // Leak canary printf("[1] Leak Canary\n"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n"..

[dreamhack] level 2 ssp_001

바이너리 코드 분석get_shell() 이라는 함수가 보이는데, ret addr을 해당 함수로 덮어쓰면 셸을 획득 할 수 있을 것이다. 1. P를 입력하면 Element index : 라는 문구와 함께 사용자 입력을 받는다. 사용자 입력을 받으면 해당 값은 idx에 저장되고 print_box함수가 실행된다.print_box() 함수에서는 idx 번째에 저장되어 있는 box 값을 출력해준다. 따라서 만약 카나리가 box와 0xAA 만큼 떨어져 있다면 idx에 0xAA를 입력하여 카나리 값을 읽어 낼 수 있을 것이다.2. E를 입력하면 Name Size : 라는 문구가 출력되고 사용자 입력을 받는다. 사용자가 입력한 값은 name_len에 저장된다. 또 Name : 이라는 문구가 뜬 뒤에 사용자 입력을 한번..