목록분류 전체보기 (285)
tmxklab
1. 문제 nc svc.pwnable.xyz 30012 1) 문제 확인 2) 함수 확인 2-1) main() int __cdecl main(int argc, const char **argv, const char **envp) { unsigned __int8 v3; // [rsp+2Fh] [rbp-11h] __int64 v4; // [rsp+30h] [rbp-10h] void *v5; // [rsp+38h] [rbp-8h] setup(argc, argv, envp); v4 = gen_canary(); puts("Jump jump\nThe Mac Dad will make you jump jump\nDaddy Mac will make you jump jump\nThe Daddy makes you J-U-M-P..
1. 문제 nc svc.pwnable.xyz 30011 1) 문제 확인 2) 함수 확인 2-1) 메인 함수 2-2) create_user() 2-3) print_user() 2-4) eidt_usr() 2-5) read_int32() 3) mitigation 2. 접근방법 1) 변수 위치 정리 name데이터는 힙에 저장되고 age데이터는 스택에 저장됨 2) 디버깅 확인 create_user()에서는 s변수에 입력(name)을 받고 age값 스택에 저장됨 edit_usr()에서는 cur변수에 입력(name)을 받음 v0+0x48[0x7ffffffecea8]에 저장됨 이 때, [rbx+0x48] 이렇게 주소 값을 참조하여 저장하므로(rbx : s변수 주소 값) 아까랑 동일하게 0x7ffffffecea8에 저..
1. 문제 nc svc.pwnable.xyz 30010 1) 문제 확인 2) 함수 확인 2-1) main() int __cdecl main(int argc, const char **argv, const char **envp) { setup(&argc); printf("Name: "); read(0, &cmd[48], 0x1Fu); vuln(); return 0; } - cmd[48]에 입력 값을 받고 vuln()을 실행 2-2) vuln() unsigned int vuln() { int v1; // [esp+8h] [ebp-10h] unsigned int v2; // [esp+Ch] [ebp-Ch] v2 = __readgsdword(0x14u); while ( 1 ) { while ( 1 ) { prin..
1. 문제 nc svc.pwnable.xyz 30009 1) 문제 확인 이름을 입력하고 게임을 진행할 수 있다. 2) 함수 확인 win함수와 main함수를 포함한 다수의 함수들 확인 2-1) 메인 함수 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { const char *v3; // rdi int v4; // eax setup(); v3 = "Shell we play a game?"; puts("Shell we play a game?"); init_game(); while ( 1 ) { while ( 1 ) { print_menu(v3, argv); v3 = "> "; printf("> "); v4 = read_i..
1. 문제 nc svc.pwnable.xyz 30008 1) 문제 확인 2) 함수 확인 2-1) 메인 함수 round_1,2,3()를 실행하여 반환 값이 모두 참인 경우 win함수 실행 +) round_1,2,3()의 로직은 다음 접근 방법에서 분석해보도록 하자 3) 메모리 보호기법 및 파일 정보 확인 2. 접근방법 1) round_1() - '-'문자가 없는 v1과 v2를 입력으로 받는다.(음수를 사용할 수 없음) - 다음 두 개의 조건 문이 참이면 통과한다. 1. v1 1337 && v1 * v2 == 1337 - 이 때, v1과 v2의 데이터 타입은 int형이다. 3) round_3() - v2, v2+4, v3, v3+4, v4를 입력으로 받는다. - 다음 2개의 조건문이 참이면 통과한다. 1. ..
1. 문제 nc svc.pwnable.xyz 30007 1) 문제 확인 - 1) Malloc : size값 만큼 메모리 할당 - 2) Free : 메모리 해제 - 3) Read : Input값 저장 - 4) Write : Input값 출력 2) 함수 확인 2-1) 메인 함수 - v3값에 따라 vtable에 지정된 함수를 호출 - vtable이 뭔지는 이따가 확인해보자 2-2) _() - 요거를 호출해야 한다. 2-3) do_malloc() - input값으로 size를 받고 result에 할당된 메모리 주소를 넣는다. - result값이 존재하면 heap_buffer(bss영역)에 주소 값 저장하고 아니면 1을 저장 2-4) do_read() - heap_buffer가 존재하는 경우 heap_buffer..
1. 문제 nc svc.pwnable.xyz 30006 1) 문제 확인 - menu 1 : 키를 재생성하는 메뉴 - menu 2 : 플래그를 로드 - menu 3 : 플래그 값을 출력(하지만 안됨) 2) 함수 확인 - 특이하게 real_print_flag()와 print_flag()가 존재 2-1) 메인 함수 - line 8 : generate_key함수 실행 - line 18 ~ 20 : 2를 입력한 경우 load_flag함수 실행 - line 24 ~ 28 : 1을 입력한 경우 generate_key함수 실행 - line 30 ~ 32 : 3을 입력한 경우 print flag함수 실행 2-2) generate_key() - menu(1) - line 11 : s변수를 0x48만큼 0으로 메모리에 세팅..
1. 문제 nc svc.pwnable.xyz 30031 1) 문제 확인 - 메뉴가 주어지고 원하는 메뉴를 선택하여 입력 값을 넣을 수 있으며 무한 루프로 작동(근데 age를 입력하면 프로그램이 종료된다) 2) 함수 확인 2-1) IDA(hex-lay) - 메인 함수 - 입력 값에 대한 처리를 구분해 놓았으며 4를 입력한 경우 auth함수의 반환 값이 참이면 win함수가 실행 - 32번째 줄에서 auth함수의 파라미터로 s변수를 받는데 11번째 줄에서 s변수는 memset을 통해 0으로 56bytes만큼 초기화되어 있음 - 근데, 특이한 점이 21번째 줄의 scanf와 28번째 줄의 scanf에서 파라미터가 다르다(아까 age를 입력했을 때 문제가 생기는 이유 → 28번째 줄 scanf에서 v6의 주소 값..
1. 문제 nc svc.pwnable.xyz 30029 1) 문제 확인 - 세 개의 입력 값을 받고 결과를 출력해주는 프로그램 2) 함수 확인 2-1) IDA(hex-lay) - 메인 함수 - v4, v5, v6에 입력 값을 받아 result[v6]의 값을 출력 - result[v6] = v5 (xor) v4 2-2) IDA(hex-lay) - win함수 3) 메모리 보호기법 및 파일 정보 확인 2. 접근 방법 먼저, 가장 눈에 띄는 부분은 이 부분이다.(main함수 line 19) xor 계산한 값을 result[v6]에 저장하는 로직이다. 따라서, result의 인덱스와 값을 조작할 수 있다.(원하는 주소와 해당 주소에 값을 지정할 수 있음) 그리고 result는 main함수에서 선언한 변수가 아니라..
1. 문제 nc svc.pwnable.xyz 30016 1) 문제 확인 - menu가 주어지고 무한 루프로 이루어져있음 2) 함수 확인 2-1) IDA(hex-lay) - 메인 함수 - 1을 입력하면 edit_note함수 실행 - 2를 입력하면 edit_desc함수 실행 - 0을 입력하면 프로그램 종료 2-2) IDA(hex-lay) - win함수 2-3) IDA(hex-lay) - edit_note함수 - 입력할 문자열 길이만큼 할당하여 read함수를 통해 buf에 입력 받음 - strncpy함수를 통해 입력한 길이만큼 buf에 저장된 문자열을 s(전역변수)로 복사 - 마지막으로 buf의 할당된 메모리를 free를 통해 해제 2-4) IDA(hex-lay) - edit_desc함수 -buf(전역변수)를..