목록전체 글 (121)
또 뭐하지

풀이실행파일의 main 함수를 살펴보자. 이번에는 sub_140001000 함수가 중요한 것 같으니 살펴보자.sub_140001000 함수를 살펴보면 배열 aC와 주소 a1에서 시작하는 메모리의 내용이 일치해야한다. 여기서 a1은 입력을 받는 값이니 우리가 원하는 문자열은 배열 aC에 있을 것이다. aC 배열을 살펴서 순서대로 읽어보면 원하는 입력값을 찾을 수 있다. * main 함수에 있는 주소값을 더하며 비교하는 구문 . 해당 주소값으로 가면 플래그를 확인할 수 있다.

풀이IDA를 통해 chall의 main 함수 코드를 살펴보면1. Random number v6와 사용자 입력값 v7을 xor하여 v11을 얻는다2. s1은 s(=v11)을 거꾸로 저장한 것이다3. s1=s2=a0b4c1d7과 같으면 flag를 출력한다 Random number와 입력값의 xor 값이 7d1c4b0a와 같으면 된다. 즉, 7d1c4b0a와 Random number를 xor한 값을 입력해주면된다. from pwn import *r = remote('host3.dreamhack.games', 21711)r.recvuntil(b': ')a = r.recvline()a = a.decode('utf-8').strip()b = int(a, 16)^ 0x7d1c4b0ab = str(b).encode()..

풀이 rev-basic-0 때와 동일하게 correct가 나오는 부분으로 타고 들어갔다. main함수 코드를 살펴보면 sub_140001000 함수에 따라 correct 또는 wrong이 나오는 것을 알 수 있다.sub_140001000를 살펴보면 입력값의 각 자리가 조건에 모두 만족해야한다는 걸 확인했다. 여기서 'r' 단축키를 이용해서 숫자를 문자로 변환해서 원하는 문자열을 얻을 수 있었다. 배운점IDA는 단축키를 잘 쓸 줄 알아야겠구나이름 재설정(n): 함수, 변수의 이름을 변경합니다.숫자-문자 아스키코드 변환(r): 아스키코드 테이블에 따라 숫자는 문자로, 문자는 숫자로 변환합니다.

풀이#!/usr/bin/env python3import randomimport signalimport sysMENU_GAMBLE = 1MENU_VERIFY = 2MENU_FLAG = 3MENU_LEAVE = 4money = 500verified = Falsedef show_menu(): print('=======================================') print('1. go to gamble') print('2. verify you\'re a robot') print('3. buy flag') print('4. leave')def get_randn(): return random.randint(0, 0xfffffffe)..

풀이먼저 flag파일의 경로를 hex로 변환한다. 여기서 리틀엔티안방식으로 정렬하는거 기억해야한다!section .textglobal _start_start: push 0x0 mov rax, 0x676e6f6f6f6f6f6f push rax mov rax, 0x6c5f73695f656d61 push rax mov rax, 0x6e5f67616c662f63 push rax mov rax, 0x697361625f6c6c65 push rax mov rax, 0x68732f656d6f682f push rax mov rdi, rsp xor rsi, rsi xor rdx, rdx mov rax, 2 ..
Shellcode익스플로잇(Exploit) : 상대 시스템을 공격하는 것셸코드(Shellcode) : 익스플로잇을 위해 제작된 어셈블리 코드 조각. 셸코드는 어셈블리어로 구성되며 공격을 수행할 대상 아키텍처와 운영체제에 따라, 그리고 셸코드의 목적에 따라 다르게 작성. 1. orw 셸코드: 파일을 열고, 읽은 뒤 화면에 출력해주는 셸코드. [예시] "/tmp/flag"를 읽는 셸코드 - 셸코드의 동작을 C언어 형식의 의사코드로 표현한 것char buf[0x30];int fd = open("/tmp/flag", RD_ONLY, NULL);read(fd, buf, 0x30);write(1, buf, 0x30); - 필요 syscallsyscallraxrdirsirdxread0x00fd*bufcountwri..

풀이문제파일을 실행해보고 아무거나 입력을 해보았다. IDA를 통해 문제파일을 열어서 바이너리에 포함된 문자열을 확인했다. Compar3_the_str1ng이 의심스럽지만, 일단 Wrong에 반대되는 Correct를 찾았다. 이게 어떻게 출력되는지 찾으면 원하는 문자열을 찾을 수 있을 것 같다. 단축키 'x'를 통해서 Correct가 참조되는 함수를 확인했다. 단축키 'F5'를 통해서 해당 부분을 디컴파일 해보았다. 디컴파일된 코드가 나왔다. 여기서 sub_7FF7C5CF1000 함수의 결과에 따라서 Correct 또는 Wrong이 출력되는 것을 확인할 수 있다. 그럼 이제 sub_7FF7C5CF1000를 확인해봤다. Compar3_the_str1ng과 입력값을 비교해서 같은지 확인하고 있다. 원하는 문..

int_reversingpwndbgpwndbg를 실행하고 info func명령을 통해서 함수 목록을 확인했다.disassemble main 명령을 통해서 main 함수의 어셈블리 코드를 확인했다.코드를 살펴보면cmp DWORD PTR [rbp-0xc],eax : eax 값과 rbp-0xc 값을 비교합니다.mov eax, 0x0, call 0x10b0 : 해당 부분에서 scanf 함수를 호출하고 eax가 인자로 사용된 것을 보아 우리가 찾는 값이 rbp-0xc 에 저장되어 있는 것을 알 수 있다. mov QWORD PTR [rbp-0xc], 0x146 : 이 부분에서 우리가 찾는 값이 0x146인 것을 확인할 수 있다. 0x146은 10진수로 326이다. IDAIDA에서 int_reversing 파일을 ..