목록보안/개인공부 (32)

https://dreamhack.io/learn/273#1 로그인 | Dreamhack dreamhack.io // Name: iofile_aar // gcc -o iofile_aar iofile_aar.c -no-pie #include #include #include char flag_buf[1024]; FILE *fp; void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int read_account() { FILE *fp; fp = fopen("/home/iofile_aar/flag", "r"); fread(flag_buf, sizeof(char), sizeof(flag_buf), fp); fclose(fp); } int main(..

https://dreamhack.io/learn/270#1 로그인 | Dreamhack dreamhack.io __environ이라는 이름의 전역 변수가 존재한다. 이는 시스템 명령어를 실행하기 위한 execve 계열의 함수와 getenv 등 환경 변수와 관련된 함수에서 참조하는 변수이다. // Name: environ.c // Compile: gcc -o environ environ.c #include #include #include #include #include void sig_handle() { exit(0); } void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); signal(SIGALRM, sig_handle); alarm(5);..

https://dreamhack.io/learn/269#1 로그인 | Dreamhack dreamhack.io dreamhack의 새로운 로드맵 중 _rtld_global에 대해 공부 했다. 알고 있었던 내용이지만 복습하는 마음으로 정리하기로 했다. // Name: ow_rtld.c // Compile: gcc -o ow_rtld ow_rtld.c #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { long addr; long data; int idx; init(); printf("stdout: %p\n", stdout); while (1) { printf("> "); scanf("..

---2022 / 01 / 29--- 3일째 삽질 중이다. fini_array을 덮어 main을 실행한 후 stack_chk_fail이 터지기 때문에 got를 수정하여 다시 main을 돌게 했다. 다시 한번 입력을 받은 후에는 ret이 실행되어 이상한 주소로 간 후에 종료된다. 여기서 어떤 방향으로 가야 할지 잘 모르겠다. 다시 입력을 받을 때 main으로 돌게 할 수 있는 방법이 있나 모르겠다. 어떤 주소를 수정해야 하는지 잘 모르겠다. gadget을 찾아보니 syscall이 있긴하다. 이것을 사용할 수 있나 고민도 해보아야 겠다. ---- 2022 / 01 / 30 --- 생각해보니 stack_chk_fail을 계속 터뜨려주면 main을 무한으로 돌릴 수 있는 방법이 있었다. canary를 직접 덮는..

참고자료https://dreamhack.io/learn/11#40 로그인 | Dreamhack dreamhack.io glibc 2.24이상 버전부터 IO_validate_vtable이 추가되어 vtable을 검사한다. IO_validate_vtable 함수가 _libc_IO_vtables의 섹션 크기를 계산한 후 파일 함수가 호출될 때 참조하는 vtable 주소가 _libc_IO_vtables 영역에 존재하는지 검증한다. 만약 vtable 주소가 _libc_IO_vtables 영역에 존재하지 않는다면 IO_vtable_check 함수를 호출하여 포인터를 추가로 확인한다. IO_validate_vtable 함수로 인해 파일 함수의 vtable은 _libc_IO_vtables 섹션에 존재해야 호출할 수 있..

PE 포맷 WINDOW에서 사용하는 실행 파일을 일컫는 말이다. MS에서 다른 OS와 이식성을 향상하기 위해 만든 파일 포맷이다. PE 파일 종류 4개의 계열 가지고 있다. 실행 파일 EXE, SCR 라이브러리 파일 DLL, OCX, CPL, DRV 오브젝트 파일 OBJ 드라이버 파일 SYS, VXD PE 파일 구조 IMAGE_DOS_HEADER e_magic : Signature 어떤 구조인지 알려준다. 각 파일의 형식에 따라 다른 파일 시그니처를 가진다. e_lfanew : Offset to New EXE Header 실제 파일이 어디서 시작하는지 알 수 있다. 저 지점으로 가보면... PE가 있는것을 알 수 있다. MS-DOS Stub Program Signature: e_lfanew에서 알려주었던..

https://dreamhack.io/wargame/challenges/101/ validator-revenge Description 1회 CTF에서의 프로그램이 너무나 취약한 것을 인지한 개발자가 몇 가지를 더 추가한 것 같습니다. 취약한 인증 프로그램을 익스플로잇해 flag를 획득하세요! Reference https://dreamhack.io/lectur dreamhack.io 며칠째 삽질 중이다. 처음 조건문들을 모두 통과하고 ROP를 이용하여 풀려했으나 relro가 걸려있어 got overwrite는 불가능했다. 출력 함수도 없다. stdout을 변조해서 leak 하려 했으나 인자를 주는 게 너무 어려웠다. 사람들은 stack pivoting을 이용해서 해결했다고 하나 어떻게 rsi에 stdout..

read함수 밖에 없는 아주 간단한 코드이다. 출력도 없어서 leak을 못했다. 먼저 bss영역에 /bin/sh를 삽입한다. 그 후 read의 got를 1byte overwrite 하여 syscall를 이용하기로 했다. 하지만 rax를 수정할 방법을 찾기가 어려웠다. read의 반환값을 이용하려고 했지만 이상하게 되지 않았다. 다행히 가젯 중에 pop rbp가 있어서 이를 이용했다. pop rbp에 0x5f를 넣고 lea rax, [rbp+buf] 쪽으로 ret을 했다. buf가 -0x50이기때문에 rax에 0xf가 들어갔다. 그 후 call에서 syscall이 실행되어 sigreturn을 진행하려 했다. 레지스터 값들도 모두 0으로 초기화 되어있길래 syscall이 잘 먹혔다 생각해서 기분이 좋았지만 ..