목록2021/05 (12)
Sechack
앞으로 이 카테고리에는 글을 적고싶을때마다 내 과거를 화상하며 마음대로 글을 써보려고 한다. 나는 컴퓨터를 초6때 C언어로 처음 접했다. 접하게 된 계기는 매우 단순하고 우연한 계기였다. 친구집에 놀러갔는데 친구가 C#으로 퀴즈프로그램 만들고있길래 뭔가 간지나보여서 어떻게 하는거냐고 물어보고 집에와서 친구한테 질문폭탄 던지면서 똑같이 만들어봤다. 그리고 TV에서만 보던 전문가의 영역인줄 알았던 텍스트코딩을 내가 했다는것에 매우 뿌듯해하고 있었다. 그리고 친구가 본격적으로 코딩 공부해보고 싶다면서 C언어 코딩도장이라는 책을 샀다. 그때당시에는 단순히 내가 쟤보다 빨리 배워야지 하는 지금생각하면 좀 어이없는 경쟁심으로 똑같은 책을 사서 경쟁했다. 그런데 이게 너무 재밌고 흥미있고 내 적성에 맞고 재능까지 보..

간단한 fsb문제이다. 두번 fsb페이로드를 보낼 기회가 있다. 입력은 0x12C만큼 받을 수 있어서 넉넉하다. 첫번째에 leak하고 두번째에 덮으면 될것이다. 나는 전에 dCTF를 하면서 배운 printf함수의 트릭을 사용했다. printf함수는 출력할 문자가 너무 많아지면 내부 루틴에서 malloc을 호출한다는 트릭이다. malloc_hook덮고 맨뒤에 %100000c붙여주면 끝난다. from pwn import * #p = process(["./adult_fsb"], env={"LD_PRELOAD":"./libc.so.6"}) r = remote("ctf.j0n9hyun.xyz", 3040) e = ELF("./adult_fsb") libc = ELF("./libc.so.6") r.send("%49..

이번에는 지인이 준 웹해킹 문제를 풀어보았다. 문제 제작자님은 me2nuk라는 닉네임으로 활동중인 김민욱이라는 분이시다. 일단 문제를 풀때는 소스코드를 제공해주지 않고 uid, upw를 post로 보내서 sql injection을 발생시키라는 정보와 필터링되는 키워드 리스트만 얻었다. filters = ['mid', 'substr', 'substring', 'lpad', 'right', 'left', 'reverse', 'regexp', 'like', ' ', 'in' ] 필터링된 키워드는 대충 이러하다. 가장 걸리는게 공백과 substr이다. 처음에는 Burp Suite를 이용해서 테스트하려 했지만 패킷 구조를 이상하게 보냈는지 그 어떠한 injection페이로드도 먹히지 않길래 그냥 python으로 ..

처음으로 이름만 들어보던 Error based blind sql injection기법을 적용하여본 문제이다. 근데 생각보다 별거 없었다. 기존에 blind sql injection에서 달라진것은 if문을 이용해서 일부러 에러를 유발하는것이다. 문제 소스코드이다. 로그인에 성공했을때 전에 있던 문제처럼 Hello guest같이 반환해주는게 없으니까 우리는 참, 거짓 여부를 알 수 없다. sleep, benchmark함수를 필터링하니까 Time based blind sql injection은 사용할 수 없어보인다. 이것저것 넣어보던 도중 쿼리 에러가 나면 에러 내용이 반환이 된다. 우리는 이걸 이용해서 Error based blind sql injection을 사용할 수 있다. 일단 if문을 사용해서 쿼리의..

문제에서 cipher.txt파일 하나를 준다. 열어보니까 .......... 할말이 없다... 이게뭐지...ㅋㅋ 무려 파일크기가 7000kb가 넘는다. 이게 무슨 암호여;;; 근데 잘 생각해보니까 base64라는 녀석과 비슷해보였다. 생각은 무슨... 그냥 게싱... 그래서 한번 Base64디코딩 사이트에 돌려봤다. 전체 복붙하는건 텍스트가 너무 많아서 브라우저가 렉먹으니까 파일 업로드 기능을 사용했다. https://www.base64decode.org/ Base64 Decode and Encode - Online Decode from Base64 format or encode into it with various advanced options. Our site has an easy to use onl..

flag.txt파일 하나 주고 풀라고 한다. 열어보니까 이랬다. 딱봐도 caesar같아서 바로 디코딩 돌려봤다. 아...숫자...ㅠㅠㅠ 출제자분에게 물어보니까 친절하게 숫자도 같이 암호화된다고 답변해주셨다. 고전암호는 이론만 알지 많이 접해본게 아니라서 삽질 좀 했다. RSA같은건 아직 잘 모른다. 조만간 공부해볼 생각이다. 그래서 ROT디코더에 넣고 brute force옵션으로 돌려봤다. 파이썬 스크립트를 짜야되는데 귀찮아서 그냥 사이트에서 했다. 다행히 플래그 형식이 있었다. DCTFTH3D13H4SB33NC4ST 라고 나오는데 암호화된 플래그는 rq7t{7vH_rFH_vI6_pHH1_qI67}였다. 아마도 사이트에서 소문자도 대문자로 표기해주는듯 했다. 그래서 암호화된 원본 플래그에서 소문자인건 소..

알람이 10초다... 너무 적게준거 아닌가... 손퍼징... 크흠... vuln함수이다. 솔직히 여기만 봤을때는 5분컷 할줄 알았다. fsb인데 입력할 공간도 넉넉하고 while문에서 돌아가고 있다. 평범하게 주소 덮으면 되는줄 알았다. libc는 간단하게 main함수의 ret부분을 leak하면 된다. Full relro이다. 바이너리 이름은 좀 길어서 format으로 바꿔주고 풀었다. Dockerfile도 같이 주길래 봤더니 ubuntu 18.04여서 해당 환경에서 진행했다. Full relro를 보자마자 __free_hook, __malloc_hook을 덮을 생각을 했다. 하지만 바이너리 내에서 힙 관련 함수를 사용하지 않는다. 그러나 좌절하지 않고 heap chunks명령어를 쳐봤더니 청크가 있다...

main함수이다. add, edit, delete, check, exit 5개의 함수가 각각 메뉴마다 동작하는것같다. menu함수이다. s변수를 출력하길래 따라가봤더니 유니코드 형태로 나온다. 실행시켜보면 s변수는 한글인것을 알 수 있다. 그래서 IDA에서 유니코드 형태로 보인것이었다. 참고로 바이너리 이름도 한글인데 영어로 바꾸고 풀이를 진행하였다. add함수이다. smooth함수는 안에 들어가보니까 32byte를 입력받고 atoi를 이용해서 정수로 변환 후에 반환하는 함수이다. index, size, menu를 입력받을때 사용된다. 당연한 얘기지만 저 함수 내부에서 BOF따위는 터지지 않는다. 본론으로 돌아와서 add함수는 index, size, data를 입력받고 index가 0과 같거나 크고 6보..

nc서버 하나 주길래 접속해보니까 3개의 메뉴가 있다. 1번을 선택해보니까 간단한 사칙연산이 나온다. 계산기로 계산하고 보내보니까 1차 침공 성공이라면서 2차 침공을 하라고 또다시 수식을 준다. 사칙연산 노가다 문제로 추측해볼 수 있다. 3개의 메뉴 전부 봤는데 전부 계산 노가다였다. 그래서 바로 pwntools를 이용해서 자동화 스크립트 짜줬다. from pwn import * def parser(data): if b"+" in data: arr = data.split(b"+") first = int(arr[0]) second = int(arr[1]) r.sendlineafter(": ", str(first + second)) elif b"-" in data: arr = data.split(b"-") ..

void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { int v3; // eax sub_400846(); while ( 1 ) { sub_4008DA(); v3 = (char)sub_4008A7(); switch ( v3 ) { case 50: sub_40097F(); break; case 51: sub_4009DD(); break; case 49: sub_400910(); break; } } } IDA로 까봤는데 stripped가 걸려있다. 그래도 바이너리가 워낙 간단해서 분석하는데 어려움은 없었다. int sub_4008DA() { puts("1. make wish"); puts("2. view wish"); return puts("..