목록Wargame (19)
Sechack
두개의 파일을 준다. 그래서 열어봤는데 둘다 같아보인다. 우클릭 하고 속성 가서 크기도 봤는데 둘다 크기가 같다. 근데 zip파일 이름이 compare였다. 비교하라는것 같다. 그래서 HxD키고 파일 비교 기능을 이용해서 비교해봤다. 역시나... 다르다. 첫번째 파일은 N인데 두번째 파일은 H이다. F6을 계속 눌러서 틀린부분을 찾아본다. 첫번째는 q 두번째는 a 첫번째는 I 두번째는 c 첫번째는 0xd9 두번째는 k이다. 걸렸던 문자들 중에서 두번째 이미지에서 걸린걸 조합해보면 Hack이 된다. 첫번째 이미지와 두번째 이미지가 다른부분이 있고 두번째 이미지의 다른부분을 조합해보면 플래그가 나온다는 합리적 의심을 할 수가 있다. 이미 여기까지 봤을때 Hack이라는 문자열이 나왔으므로 매우 높은 확률로 계..
간단하고 가벼운 그림판으로 파일 열어보니까 hex값을 뒤집어 놓았단다. 근데 시그니처나 IHDR 이런건 정상적으로 들어가있다. 애초에 정상적으로 들어가서 이미지가 잘 읽힌것일거고... 근데 밑에보니까 뒤집혀있긴 했다. 뒤집혀있으니까 밑에부분에 시그니처와 헤더가 보이고 우리는 이제 좀더 위로 올리면서 뒤집힌 IEND를 찾아야한다. 뒤집어서 검색해보니까 나온다. 그러면 우리는 여기부터 복붙해서 뒤집으면 되는거다. 저기부터가 뒤집한 png파일이므로 저부분만 복사하고 전체 지우고 붙여넣기 하면 뒤집힌 부분만 추출이 된다. 그리고 이제 추출을 했으므로 파일을 읽고 값을 뒤집고 다시 저장하는 코드를 짜준다. f = open("./waytogo.png", "rb") data = f.read() f.close() fl..
간단한 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문을 사용해서 쿼리의..
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("..
IDA로 보면 굉장히 심플하다. 문제 이름앞에 baby가 붙어있으면 대부분 매우 어려워서 이번문제에는 어떤 hard한 요소가 있을까 하고 봤는데 진짜 간단한 fsb였다. babyheap도 그렇고 HackCTF만 baby붙은게 진짜 쉽다. checksec으로 보호기법 보기 전까지 full relro면 어떡하나 바짝 긴장했었다. baby라는 이름이 나를 긴장하게 만든다... 다행히도 Partial이다. 이러면 got overwrite가 가능하다. 문제는 1번 입력받고 프로그램이 바로 꺼진다는거였는데 read함수에서 카나리를 변조할 수가 있으므로 이건 간단하게 __stack_chk_fail함수 got를 main으로 덮어서 해결 가능하다. got에는 맨처음에 plt+6의 주소가 들어가고 그다음부터 libc에 매..