일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- L16
- basic_exploitation_001
- sint
- sd카드 리더기
- off_by_one_001
- off_by_one_000
- rev-basic-5
- rev-basic-3
- 드림핵
- 코드엔진 베이직 13
- Dreamhack
- rev-basic-1
- CodeEngn
- coin1
- basic_exploitation_000
- rev-basic-7
- 코드엔진 베이직
- rev-basic-4
- RCE
- 포너블
- Basic
- out_of_bound
- Pwnable
- rev-basic-2
- L18
- L15
- pwnable.kr
- rev-basic-6
- L17
- rev-basic-0
- Today
- Total
목록전체 글 (52)
서브웨이

이전 문제와 비슷한 유형일 것 같습니다. 일단 소스코드를 봅시다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void read_str(char *ptr, int size) { int len; len = read(0, ptr, size); printf("%d", len); ptr[len] = '\0'; } void get_shell() { system("/bi..

자 일단 RELRO랑 NX bit이 적용되어있으니 쉘코드, got 조작은 불가능 합니다. 소스코드를 봅시다. #include #include #include #include #include char cp_name[256]; void get_shell() { system("/bin/sh"); } void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int cpy() { char real_name[256]; strcpy(real_nam..

자 1단계 마지막 리버싱입니다. 한번 파일을 봅시다. 이번에도 어김없이 입력값 검증 형태입니다. 그럼 디버깅을 해봅시다. 일단 참조된 문자열엔 없으니 검증하는 부분으로 가봅시다. 이번에도 검증함수가 존재합니다. 한번 들어가봅시다. 딱봐도 조금 복잡해보입니다. 정리하자면 이런 구조입니다. 일단 입력한 문자열을 불러온 뒤, 0x7FF600E53000에 위치한 암호화된 문자열(?)을 불러옵니다. (입력 문자 ^ 인덱스) + 인덱스 * 2 = 암호 문자 이렇게 연산을 진행한 뒤 한 글자씩 인덱스에 맞게 총 24번 비교를 합니다. 그럼 암호화된 문자열로 검증에 필요한 문자열을 얻기 위해 공식을 수정해봅시다. 입력 문자 = (암호 -인덱스 * 2) ^ 인덱스 이 공식으로 파이썬 코드를 짜 봅시다. def cal(c..

자 이번에도 파일을 봅시다. 또 같은 방식이네요. 일단 참조된 문자열을 검색해봅시다. 여기도 일단 안보이네요. 그럼 입력값을 검증하는 곳으로 한번 가봅시다. 여기도 출력, 입력 뒤에 정체 불명의 함수가 있네요. 여기서 검증을 하는 것 같습니다. 그럼 들어가봅시다. 자 일단 대충 흐름을 보자면 처음에 rcx에는 입력 값의 주소가 들어있습니다. 해당 값을 저장해놓은뒤 12번에 걸쳐서 0x7FF7A6273000에 존재하는 문자열과 입력한 문자열을 차례로 한 글자씩 같은지 비교를 하는 함수입니다. 그럼 0x7FF7A6273000에 어떤 것이 존재하는지 한번 봅시다. 해당 주소를 덤프에서 따라가면 다음과 같은 것들이 존재합니다. 저게 답입니다.

일단 파일을 봅시다. 이번 문제 또한 간단하게 입력값을 검증하는 방식입니다. 참조된 문자열을 검색해봅시다. 일단 여긴 없네요. 그럼 검증하는 부분 근처를 봅시다. 출력해주는 부분과 입력을 받는 부분 뒤에 정체 불명의 함수를 호출하는것을 볼 수 있습니다. 한번 해당 함수로 들어가봅시다. 이런식으로 문자 하나하나씩 검증하는 방식이네요. 답은 따로 적지 않겠습니다.