Layer7 동아리 과제 28

리버싱 8차시 과제

rev-basic-6 sub_140001000에 들어가서 디컴파일한 거 보면 이렇게 되어있다. byte_140003020[a1[i]]와 byte_140003000[i]가 같으면 된다. byte_140003000[i]가 byte_140003020[] 배열 안에 있으면 된다. 위와 같이 코드를 짜서 byte_140003000[i]가 byte_140003020[] 배열 안에 있는지 확인하는 코드를 짜면 flag를 구할 수 있다. rev-basic-7 sub_140001000 들어가서 디컴파일 해보면 위와 같이 나온다. __ROL1__이 뭔지 몰라서 어셈블리어를 봤더니 rol 명령이 있는 것을 확인할 수 있다. 검색해보니 일반 쉬프트 연산이랑 비슷한데 쉬프트 하다가 비트가 넘어가면 반대편으로 다시 넣어주는 그런..

리버싱 7차시 과제

rev-basic-2 Correct와 Wrong을 판별해주는 함수가 있다. 그거 클릭하고 확인해보면 벌써 어셈부터 수상하다. aC 옆에 "C"가 있다. cmp 부분을 보면 4 * rax 만큼 더해서 비교한다. 비교하는 aC 눌러보면 4 bytes씩 align 되어있으니 아까 cmp에서 비교하는 거 생각해보면 이게 flag라는 것을 알 수 있다. rev-basic-3 함수 리턴값으로 correct와 wrong이 갈린다. 저 함수 들어가보면 var_18이 count 변수인 거 같고, byte_140003000에 var_18 더해서 1바이트를 eax에 넣고 var_18 + arg_0 1바이트랑 var_18 xor 해서 ecx에 넣고 rcx+var_18*2랑 eax랑 비교한다. 디컴파일한 거 보면 아까 거랑 다..

리버싱 6차시 과제

ELF ELF? ELF는 Executable and Linkable Format의 약자로 말 그대로 Linkable과 Executable의 포맷이다. 간단하게 말하면 Linux/UNIX 실행파일이다. Linking View, Execution View linking전에 object file들이 relocatable file일때가 linking view이다. linking 끝나고 executable이 되면 execution view다. 그냥 말그대로 executable(실행가능)이되서 executable file이라고 부른다. 둘 다 ELF다. Executable header, Program header, Section, Section header ELF Header(Executable Header) 이 ..

리버싱 5차시 과제

imul - imul은 Signed Multiply다. - 여기선 IMUL r/m32에 해당되니 그것만 보면, - register/memory 32비트, 즉 4바이트짜리끼리 연산할 때 EAX * r/m doubleword(4바이트)를 EDX:EAX로 넣는다. - EDX:EAX notation은 상위 4바이트를 EDX에, EAX에 하위 4바이트를 저장한다는 의미다. sar, sal, shr, shl - sar은 shift arithmetic right이다. - sal은 shift arithmetic left이다. - shr은 shift right이다. logical shift를 말한다. - shl은 shift left이다. logical shift를 말한다. - arithmetic shift는 기본적으로 ..

리버싱 4차시 과제

prob1 main 함수가 보인다. main 함수를 확인해보았다. sub으로 스택을 확장하고 rbp-0x8에 fs:0x28을 넣는다. 이게 스택 카나리다. 마지막에 fs:0x28과 rbp-0x8을 비교하는 것을 볼 수 있다. main+28에 puts를 호출한다. edi에 0x4007d4가 들어간다. 0x4007d4가 문자열이라고 추측할 수 있다. __isoc99_scanf@plt는 scanf의 plt를 말한다. 이 plt가 libc의 scanf의 실제 주소를 가리키는 got를 가리킨다. edi는 아마 포맷 스트링이 될 것이고, rbp-0xc는 저장되는 위치를 말할 것이라고 예측할 수 있다. 그리고 cmp를 통해서 rbp-0xc부터 4바이트와 0xdeadbeef와 비교한다. 다르면 끝내고 아니면 flag ..

리버싱 3차시 과제

x86 VS x64 x86은 x86 계열 32비트 CPU(Intel, AMD)의 ISA이다. x86_32라고 부르는 것을 더 많이 본 것 같다. x64는 Intel이나 AMD 같은 x86 계열 64bit CPU들이 사용하는 ISA(Instruction Set Architecture)를 말한다. x64를 x86의 64비트 버전이라고 해서 x86_64라고도 많이 부른다. 기본적으로 x64는 x86을 지원한다. x64, x86 registers 레지스터는 되게 많다. 그런데 범용 레지스터(General Purpose Register)만 살펴보겠다. 그 이유는 사용자가 직접 사용할 수 있는 몇 안 되는 레지스터이기 때문이다. 실제로 디버깅할때도 거의 범용 레지스터만 본다. 가끔 eflags도 본다. cs, ss..

리버싱 2차시 과제

리버싱이란? 리버싱 : Reverse engineering의 약자로 역공학이라는 뜻이다. 바이너리의 구조, 기능, 동작을 분석한다. 크게 두 가지 방법이 존재한다. 정적 분석 : 파일을 실행하지 않고 파일 종류, 헤더, 디스어셈블러, 디컴파일러로 코드를 분석 동적 분석 : 파일을 실행하면서 코드 흐름과 메모리 상태 등을 보면서 분석 gcc 사용 코드를 작성하고 조금 옵션을 줘서 컴파일을 해보겠다. layer7.c는 원본 소스코드 파일이다. layer7.i는 전처리된 소스코드 파일이다. layer7.s는 어셈블리어 파일이다. layer7.o는 어셈블러에 의해 기계어로 변환된 파일이다. layer7은 layer7.o가 링커가 링킹을 하고나서 나온 최종적인 바이너리 파일이다. 빌드는 이 전처리기, 컴파일러, ..

하드웨어 3, 4차시 과제

임베디드 시스템 임베디드 자체는 atmega칩 같은 MCU를 포함하는 개념이지만, 일반적으로는 MCU보다 상위급 성능을 가진 프로세서를 가진 시스템을 자주 말한다. 요즘엔 기술이 발달해서 임베디드 쪽도 사용하는 프로세서 수준이 과거의 일반 컴퓨터급의 성능이 되어서 높은 티어의 임베디드 시스템은 아예 OS를 올리는 경우도 많다. 포괄적인 의미로는 특정한 기능을 수행하는 컴퓨터 시스템이다. 범용 컴퓨터의 반대말이다. 특정 기능에 집중해서 설계자들이 최적화해서 크기나 생산 비용을 줄이거나 성능을 향상시킬 수 있다. SoC를 통해 경량화, 소형화될 수 있다. 회로 설계에 관련이 많다 보니 이런 로직 게이트랑 관련이 깊다. and는 둘 다 1일 때 1을 출력하고, nand는 and에다 not을 한 거다. or은 ..

하드웨어 2차시 과제

CPU 기본 구조 CPU구조는 아키텍처마다 다 다르다. 표기법도 OS마다 약간씩 다르다. CPU는 크게 CU(Control Unit), ALU(Arithmetic-Logic Unit), Register Set으로 나눌 수 있다. ALU는 각종 산술 연산과 논리 연산을 수행하는 하드웨어 모듈이다. Register set은 레지스터(register)의 집합이다. 레지스터는 CPU 내부의 기억 장치로서, CPU가 동작하면서 사용하는 기억장치이다. 기억 장치 중에 가장 액세스 속도가 빠르다. CU는 프로그램 코드(명령어)를 해석하고 제어 신호를 발생시키는 하드웨어 모듈이다. ISA(Instruction Set Architecture)에 따라 구조가 달라진다. ISA는 컴퓨터가 실행할 수 있는 명령의 집합이다. ..

하드웨어 1차시 과제

ROM : Read Only Memory로 말그대로 읽기만 가능한 메모리를 뜻한다. 일반적으로 전원이 공급되지 않아도 데이터가 삭제되지 않고 반영구적으로 보존이 가능하기에 비휘발성(nonvolatile) 메모리라고도 한다. 일반적으로는 한번 데이터를 기록하면 더이상 수정이 불가능하기에, 바뀔 가능성이 거의 없는 BIOS같은 소프트웨어들이 이 ROM에 저장된다. 일부 특수한 종류의 ROM은 데이터를 변경하거나 쓸 수 있다. 또한 ROM이라고해서 Random Access가 안되는 것은 아니다. 실제로 대부분의 ROM은 랜덤하게 엑세스된다. 당연히 쓰기는 대부분 안된다. ROM은 여러가지로 분류할 수 있다. MROM, PROM, EPORM, EEPROM, FLASH 등이 여기에 속한다. FLASH같은 경우는 ..