2025/04 42

[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 : 이라는 문구가 뜬 뒤에 사용자 입력을 한번..

[dreamhack] level 2 Return to Shellcode

문제 분석0x7ffc17ea9690와 같이 bof 주소가 출력되고 buf와 rbp까지의 거리를 알려준다.(buf에서 sfp거리) 그리고 사용자 입력을 두번 받는다. 위의 코드에서 read(0, buf, 0x100)과 gets(buf) 코드를 보면 스택 버퍼 오버플로우가 발생한다는 것을 알 수 있다. 스택 프레임 구조 파악위에서 획득한 정보는 buf부터 sfp까지의 거리는 0x60이고 buf에서 카나리까지의 거리는 0x60 - 0x08의 값인 0x58이 된다.buf에서 sfp까지의 거리와 buf에서 카나리까지의 거리를 구했으면, buf에서 카나리까지 쓰레기 값으로 채워주고 뒤에서 카나리를 출력하도록 하면 카나리 값을 획득할 수 있다.# [2] Leak canary valuepayload = b'A' * (..

[dreamhack] level 1 basic_exploitation_001

문제 분석AAA만 입력했을 때는 아무런 동작을 하지 않는다. 하지만 A를 엄청나게 많이 입력했을때는 Segmentation fault 에러가 뜨는 것을 확인할 수 있다. 따라서 core 파일이 생성되었다. core 파일 분석core 파일을 gdb로 분석해보면 0x61616161에서 violation이 발생하였다. 그리고 esp에 우리가 입력한 aaa의 값의 일부인 aaa가 저장되어 있는 것을 확인 할 수 있다. 따라서 너무 많은 값을 입력하여 반환 주소를 aaa가 덮어쓴 것이다. basic_exploitation_001.c 코드 분석해당 파일의 코드를 보면 read_flag라는 함수에서 cat을 이용하여 flag를 읽고 있는 것을 확인 할 수 있다. 또한 buf라는 버퍼에는 0x80만큼의 공간이 있다. ..