강의 설명

본 강의에서는 다음의 내용을 설명합니다.

  • 어셈블리어란?
  • x86-64 어셈블리어
  • 데이터 이동: mov, lea
  • 산술 연산: add, sub, inc, dec
  • 논리 연산: and, or, xor, not
  • 비교: cmp, test
  • 분기: jmp, je, jg
강의 목표
간단한 어셈블리에 대한 이해
이 강의와 관련된 질문들입니다.
22개의 질문
and와 or 질문
and와 or은 2진수로 변환하고 계산하여 다시 16진수로 바꿔 계산해야하나요?
#시스템해킹
#배경지식
리버싱강의 x86 assembly 1번 문제
![](https://dreamhack-media.s3.amazonaws.com/attachments/ff503e8ae77475519d556f0325cdac82b58b39afd612906da40ca98d494ba4fa.png) 이 문제 답이 welcome To aSSemblY WoRld!가 아닌가요? 입력해도 틀렸다면서 넘어가지지 않아요 ㅠㅠ
#시스템해킹
#배경지식
asembly에서 lea관련 문의
수고하십니다. 1) 아래 2문장이 같은 결과가 되나요? lea rsi, [rbx+8*rcx] ; rbx+8*rcx 를 rsi에 대입 mov rsi, rbx+8*rcx 2) 결과가 같다면 굳이 lea를 사용하는 이유가 있을까요?
#assembly
#lea
#mov
시스템해킹 - stage2 어셈블리 퀴즈 1 문제좀 도와주세요!
end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가? ``` [Register] rcx = 0 rdx = 0 rsi = 0x400000 ======================= [Memory] 0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d 0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c 0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00 ======================= [code] 1: mov dl, BYTE PTR[rsi+rcx] 2: xor dl, 0x30 3: mov BYTE PTR[rsi+rcx], dl 4: inc rcx 5: cmp rcx, 0x19 6: jg end 7: jmp 1 ``` 제가 이해한건 1. rsi+rcx의 주소를가진 메모리값을 1바이트 불러와 dl에 저장 2. dl과 0x30 xor 연산후 dl에 저장 3. dl을 rsi+rcx 주소를 가진 메모리값 1바이트 크기의 해당하는 곳에 대입 4. 이 과정을 메모리주소 0x400019까지 반복 도와주세요 ㅠㅠ 어디서 막힌건지 모르겠어요 막막해요.. 문자로 변환하고 했는데 다 틀렸다고 나와서 모르겠어요..ㅠ
#어셈블리
#퀴즈
addr과 rip
jmp 예제에 보면 'jmp addr: addr로 rip를 이동시킵니다.' 라고 쓰여져 있는데 여기서 addr과 rip가 의미하는 것이 정확히 무엇인가요?
#시스템_해킹
#배경지식
and 와 or 결과 차이
and 예시에서는 [Register] eax = 0xffff0000 ebx = 0xcafebabe [Code] and eax, ebx [Result] eax = 0xcafe0000 결과가 ffff 대신에 cafe로 나오고 or 예시에서는 [Register] eax = 0xffff0000 ebx = 0xcafebabe [Code] or eax, ebx [Result] eax = 0xffffbabe 결과가 cafe 대신에 ffff 가 나오는데 이유가 무엇인가요
#시스템_해킹
#배경지식
QWORD DWORD 개념이 이해가 잘 안갑니다.
x86 Assembly🤖: Essential Part(1) QWORD PTR [0x8048000] 0x8048000의 데이터를 8바이트만큼 참조 DWORD PTR [0x8048000] 0x8048000의 데이터를 4바이트만큼 참조 WORD PTR [rax] rax가 가르키는 주소에서 데이터를 2바이트 만큼 참조 라고 하는데 몇 바이트 만큼 참조한다는 것이 무슨 뜻인가요? 감사합니다.
#시스템_해킹
#배경지식
gdb 어셈블리 주소에 관한 기초적인 질문
![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/980065274a976ba22ec6a749ca0d62407e553c67516eaea5b98cc0f3e2911876.png) 다음과 같은 사진을 gdb로 분석할 때가 많은데 왜 메모리 주소 간격이 0x0000000000000008씩 늘어나는지 궁금합니다. 평상시에 메모리 간격 같은 건 딱히 의식하지 않고 리버싱 및 포너블 문제들을 풀어왔던 것 같은데 생각해보니 이제껏 리버싱을 했던 파일들을 보면 꼭 메모리주소 간격이 0x0000000000000008이 아닐 때도 있더라고요 운영체제 가상메모리 같은 것을 공부할 때는 메모리주소를 그냥 1씩 증가하는 식으로의 예제만 접했던 것 같고 무언가 이유가 있던 것 같은데 딱히 기억나지 않네요
#시스템_해킹
#배경지식
연산이 너무 어려워요 ㅠ
0x31337 + 0x3 에선 0x31340 대신 0x3133A인 이유가 뭔가요?
#시스템_해킹
#배경지식
계산질문
산술 연산이나 다른 여러가지 문제를 풀때 필요한 기본지식을 알려주실 수 있나요 메모리값 끼리 더한다든가 차근차근히 어떻게 푸는지요 2진수로 바꿔야하는건가요? 그리고 산술연산에서 [rbx+rcx*8] 이 왜 0x03 인지 알려주세요 rbx = 0x555555554000 rcs = 0x2
#시스템_해킹
#배경지식
xor 질문
[Register] rax = 0x35014541 rbx = 0xdeadbeef ================================== [Code] 1: xor rax, rbx 2: xor rax, rbx 3: not eax 에서 1번까지 실행했을때의 문제에서 0x35014541과 0xdeadbeef를 2진수로 변환하면 각각 110101000000010100010101000001 11011110101011011011111011101111 가 나오는데 여기서 xor을 어떻게 대입해야 할까요 남는 자리수를 없애거나, 1로 대입 혹은 0으로 대입하는 등 여러 방식으로 대입해도 답과는 다른 답이 나오고 있어서 어디부터 잘못되었는지 모르겠습니다
#시스템_해킹
#배경지식
덧샘과 뺄셈
add rax, [rbx+rcx*8] 이라면 0x555555554000 + 0x2*8 = 0x555555554000 + 10 으로 해서 0x555555554010이 되니, 1번 예제의 1번 코드는 답이 0x3이 아닌가요..? 그런데, 답은 0x3133A라고 나와서요 ㅠㅠ 풀이과정이 어떻게 되는 건가요..?
#시스템_해킹
#배경지식
덧셈과 뺄셈 질문
[Register] rax = 0x31337 rbx = 0x555555554000 rcx = 0x2 ================================= [Memory] 0x555555554000| 0x0000000000000000 0x555555554008| 0x0000000000000001 0x555555554010| 0x0000000000000003 0x555555554018| 0x0000000000000005 0x555555554020| 0x000000000003133A ================================== [Code] 1: add rax, [rbx+rcx*8] 2: add rcx, 2 3: sub rax, [rbx+rcx*8] 4: inc rax 에서 1번 문제가 add rax, [rbx+rcx*8] 인데 rcx * 8을 한다면 10이고 그것을 5555 5555 4000과 더한값인 5555 5555 4010을 rax에 더하는 거니까 rax값에 들어있는 31337을 포함하여 더해야 하는거 아닌가요? 정답은 보니까 5555 5555 4010을 가리키는 값인 3을 rax인 레지스터에 더하여 3133A가 정답이던데 제가 무엇을 읽는것을 빠트렸길래 rax값은 3을 더하게 되었을까요 *(WORD *)rdi 이게 어떻게 읽히는지만 알면 혼자 해결 할 수 있을거 같습니다
#시스템_해킹
#배경지식
연산이 이해가 안됩니다 ㅠㅠ
rcx = 0x02일 때 rcx * 8 = 0x10가 되는 이유를 모르겠습니다..
#시스템_해킹
#배경지식
시스템 해킹 로드맵 질문
안녕하세요. 이번에 해킹에 처음으로 입문을 하게된 IT학과 학생입니다. 다른 것이 아니고 강의 도중에 어셈블리와 각종 레지스터 종류 별로 로드맵안에 있던데 제가 제가 학교에서 2년전에 들었었지만 컴퓨터 아키텍쳐나 어샘블리 레지스터 내용을 뭘 말할려는 지는 알겠습니다. 현재 로드맵에서 어셈블리와 컴퓨터구조와 같은 과목을 파면 정말 있는 내용보다 깊게 들어가게 되는데 현재 시스템 해킹을 위해서는 현재 로드맵 안에 있는 내용 위주로만 봐도 괜찮은 거죠??
#시스템_해킹
#배경지식
어셈블리어 처음 배운는데 sub rax, [rbx+rcx*8] 이게 무슨 말인지 모르겠습니다...
[Register] rax = 0x31337 rbx = 0x555555554000 rcx = 0x2 ================================== [Code] 1: add rax, [rbx+rcx\*8] 2: add rcx, 2 3: sub rax, [rbx+rcx\*8] 2번에서 rcx에 2를 더한다는 말인데 ***0x2에 2를 어떻게 더하면 되는건가요*** 그냥 간단하게 0x4라고 생각해도 되는 건가요? 3번 [rbx+rcx*8]에서 ***8 이게 무슨 말인지 전혀 모르겠**어요 곱하기 인가요....? 숫자를 모두 16진수로 바꾼 다음에 생각해 봐야 하는 걸까요? 정말 아무리 생각해보고 구글링 해도 *8 이건 나오질 않아 질문글 올려봅니다....
#어셈블리
#8
이해가 안됩니다.
레지스터, 메모리 및 코드가 다음과 같을 때, 아래에서 적절한 값을 채우시오. [Register] rax = 0xffffffff00000000 rbx = 0x00000000ffffffff rcx = 0x123456789abcdef0 ================================== [Code] 1: and rax, rcx 2: and rbx, rcx 3: or rax, rbx 1번. Code를 1까지 실행했을 때, rax에 저장된 값은 0x1234567800000000 이다. 2번. Code를 2까지 실행했을 때, rbx에 저장된 값은 0x000000009abcdef0 이다. 3번. Code를 3까지 실행했을 때, rax에 저장된 값은 0x123456789abcdef0 이다. 여기서 문제 3번에서 or 연산자를 쓰는데 둘다 1이니깐, ffffffff 아닌가요? 왜 답이 저렇게 나오나요?
#시스템_해킹
#배경지식
[Memory]
메모리가 0x555555554000| 0x0000000000000000 이렇게 있을 때 |의 왼쪽에 있는 것과 오른쪽에 있는 것의 의미를 알고 싶습니다.
#시스템_해킹
#배경지식
not eax
[Code] 1: xor rax, rbx 2: xor rax, rbx 3: not eax not rax가 되어야 하는 거 아닌가요??
#시스템_해킹
#배경지식
and, or 연산
``` [Register] eax = 0xffff0000 ebx = 0xcafebabe [Code] and eax, ebx [Result] eax = 0xcafe0000 ``` 와 ``` [Register] eax = 0xffff0000 ebx = 0xcafebabe [Code] or eax, ebx [Result] eax = 0xffffbabe ``` 의 어셈블리어 코드에서 eax의 f들은 무슨 역할을 하고 있는지 궁금합니다. and연산에서는 cafe가 ffff 대신에 써져있고, or 연산에서는 ffff가 cafe 대신에 연산의 결과로 써져있는데 무슨 규칙이 있는건가요?
#시스템_해킹
#배경지식
Xor 연산
[Register] eax = 0xffffffff ebx = 0xcafebabe [Code] xor eax, ebx [Result] eax = 0x35014541 연산 결과가 이해가 가질않습니다.. 왜 뺴기를 하나요??
#시스템_해킹
#배경지식
메모리 연산
``` [Register] rax = 0x31337 rbx = 0x555555554000 rcx = 0x2 ================================= [Memory] 0x555555554000| 0x0000000000000000 0x555555554008| 0x0000000000000001 0x555555554010| 0x0000000000000003 0x555555554018| 0x0000000000000005 0x555555554020| 0x000000000003133A ================================== [Code] 1: add rax, [rbx+rcx*8] ``` 1번 코드 해설이 이해가 가지 않습니다. "rax의 값은 rbx+0x10(0x555555554010) 에 저장된 0x3 만큼 증가합니다." add rax, [rbx+rcx*8] -> rax의 값에 rbx 값 + (rcx 값 * 8) 하는 것 아닌가요? 풀이 설명 부탁드립니다...!
#시스템_해킹
#배경지식
강의 평점
0.0★ (0)
0
x86 Assembly🤖: Essential Part(1)
0.0★ (0)
Free
상세정보
약 1 hour 소요
쉬운 난이도
없음