//광고차단회복
반응형

어셈블리 코드 실행시 출력되는 결과를 고르는 문제이다.

A 4r3 y0u r34dy 70 d3bu6?
B are you ready to debug?
C ready to debug?
D r34dy 70 d3bu6?

 

[code]를 보면
  mov rdi, 0x400500
rdi 레지스터에 0x400500의 주소를 대입하라
  call 0x400497 <write_n>
0x400497주소의 <write_n> 함수를 호출한다

<write_n>의 함수를 살펴보면
  mov QWORD PTR[rbp-0x8], rdi
rdi 레지스터의 주소(0x400500)를 [rbp-0x8]에 대입한다
  mov DWORD PTR[rbp-0xc], esi
데이터 조작 및 복사시 소스 데이터 주소가 저장되는 esi 레지스터의 주소(0xf)를 [rbp-0xC]에 대입한다
  xor rdx, rdx
xor 연산으로 rdx를 0으로 만든다
  mov edx, DWORD PTR [rbp-0xc]
edx 레지스터에 [rbp-0xc] 주소를 대입한다
  mov rsi, QWORD PTR [rbp-0x8]
rsi 레지스터에 [rbp-0x8] 주소를 대입한다
  mov rdi, 0x1
rdi 레지스터에 1을 대입한다
  mov rax,0x1
rax 레지스터에 1을 대입한다
  syscall
시스템 콜을 통해 출력하는듯하다
그 외의 어셈블리어는 프로그램을 종료되도록 하는 코드이다.

mov QWORD PTR[rbp-0x8], rdi
mov DWORD PTR[rbp-0xc], esi
코드를 표로 보면 아래와 같다.

rbx
rbp-0x8 0x400500
rbp-0xc 0xf

[rbp-0x8] 위치에 0x400508이 [rbp-0xc] 위치에 0xf가 있는 것이다.

또한, x86 아키텍처인 리틀엔디안 방식으로 저장되기에 아래의 표와 같다. 

0x400500 0x72 0x33 0x34 0x64 0x79 0x20 0x37 0x30
0x400508 0x20 0x64 0x33 0x62 0x75 0x36 0x3f 0x00

 

syscall 동작 방식을 찾아보면 rax, rdi, rsi, rdx, r10,r8,r9 순으로 인자를 받는 것을 알 수 있다. 
xor 연산 후  edx 레지스터에 0xf를, rsi에 0x400500을 대입하고 rax,rdi에 1을 대입해 syscall을 불러 인자로 쓰이고 있다.
syscall 인자는 rax가 1이므로 write를 rdi에 1을 넣어 파일 디스크립터 1인 표준출력, 출력할 주소인 rsi(0x400500)을, 출력 사이즈인 rdx(0xf, 10진수 15)를 가지고 있다.

그렇기에 리틀엔디안 방식으로 0x400500부터 0x400508의 0x72~x3f까지를 출력하게 된다.

그 문자열을 아스키 코드로 바꾸면 정답은 이와 같다.

더보기

( D ) r34dy 70 d3bu6?

 

 

반응형

'리버싱' 카테고리의 다른 글

dreamhack Quiz:x86 Assembly 1  (0) 2022.08.24
반응형

프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 아스키 문자로 변환하는 문제이다.

레지스터는 카운터로 사용하는 rcx, 추가적인 연산에 사용하는 rdx 레지스터 그리고 문자열 출발지 주소를 저장하는 레지스터 rsi는 0x400000를 가지고 있다.

[code]를 살펴보면
  1: mov dl, BYTE PTR[rsi+rcx] 
BYTE(1 byte)의 [rsi+rcx]의 메모리 값을 dl에 대입하라
  2: xor dl, 0x30
dl의 값과 0x30을 xor 연산하여 dl에 대입하라
  3: mov BYTE PTR[rsi+rcx], dl
[rsi+rcx]의 메모리 값에 dl를 대입하라
  4: inc rcx
rcx의 값을 1 더하라
  5: cmp rcx, 0x19 
rcx의 값과 0x19(10진수 25)와 비교하라
  6: jg end
rcx가 0x19보다 크다면 jg(ZF=0 & SF=OF) end로 점프하라 
  7: jmp 1
jg가 실행되지 않으면 code 1로 점프하라

즉, 프로그래밍에서의 배열에서 rsi[rcx]와 같은 형태이며 rcx가 1씩 증가하며 25보다 커지면 end가 되는 구조이다.

 

Memory에서 16진수를 10진수 2진수로 계산 해보면 
;16진수 |  10진수                  //2진수
0x400000
0x67 | 103  = 64+32+4+2+1        // 0110 0111 
0x55 | 85  = 64+16+4+1              // 0101 0101 
0x5c | 92 = 64+16+8+4               // 0101 1100 
0x53 | 83 = 64+16+2+1              // 0101 0011
0x5f | 95 = 64+16+8+4+2+1     // 0101 1111 
0x5d | 93 = 64+16+8+4+1        // 0101 1101 
0x55 | 85 = 64+16+4+1            // 0101 0101 
0x10 | 16 = 16                           // 0001 0000 

0x400008
0x44 | 68 = 64+4                      // 0100 0100 
0x5f | 95 = 64+16+8+4+2+1  // 0101 1111 
0x10 | 16  = 16                         // 0001 0000 
0x51 | 81 = 64+16+1              // 0101 0001 
0x43 | 67 = 64+2+1                // 0100 0011 
0x43 | 67 = 64+2+1                // 0100 0011 
0x55 | 85  = 64+16+4+1        // 0101 0101 
0x5d | 93 = 64+16+8+4+1    // 0101 1101 

0x400010
0x52 | 82 = 64+16+2                  // 0101 0010 
0x5c | 92 = 64+16+8+4             // 0101 1100 
0x49 | 73 = 64+8+1                   // 0100 1001 
0x10 | 16  = 16                          // 0001 0000 
0x47 | 71 = 64+4+2+1             // 0100 0111 
0x5f | 95 = 64+16+8+4+2+1  // 0101 1111 
0x42 | 66 = 64+2                     // 0101 0010 
0x5c | 92 = 64+16+8+4         // 0101 1100 

0x400018
0x54 | 84 = 64+16+4              // 0101 0100 
0x11 | 17 = 16+1                     // 0001 0001 
0x00 | 0 = 0                              // 0000 0000 

 

위의 메모리 주소 값과 0x30 | 48  = 32+16 // 0011 0000 를 XOR 연산을 하면
; (sp)는 스페이스바 
; 16진수 | 10진수   //2진수(아스키코드)
0x400000
0x57 | 87          // 0101 0111(W)
0x65 | 101        // 0110 0101(e)
0x6A | 108        // 0110 1100(l)
0x63 | 99          // 0110 0011(c)
0x6F | 111        // 0110 1111(o)
0x6D | 109        // 0110 1101(m)
0x65 | 101        // 0110 0101(e)
0x20 | 32          // 0010 0000(sp)

0x400008
0x74 | 116        // 0111 0100(t)
0x6F | 111        // 0110 1111(o)
0x20 | 32          // 0010 0000(sp)
0x61 | 97          // 0110 0001(a)
0x73 | 115        // 0111 0011(s)
0x73 | 115        // 0111 0011(s)
0x65 | 101        // 0110 0101(e)
0x6D | 109        // 0110 1101(m)

0x400010
0x62 | 98          // 0110 0010(b)
0x6C | 108        // 0110 1100(l)
0x79 | 121        // 0111 1001(y)
0x20 | 32          // 0010 0000(sp)
0x77 | 119        // 0111 0111(w)
0x6F | 111        // 0110 1111(o)
0x72 | 114        // 0111 0010(r)
0x6C | 108        // 0110 1100(l)

0x400018
0x64 | 100        // 0110 0100(d)
0x21 | 33          // 0010 0001(!)
0x30 | 48          // 0011 0000(0)
이 된다.아스키 코드를 모으면 답은 이와 같다.

더보기
Welcome to assembly world!

 

반응형

'리버싱' 카테고리의 다른 글

dreamhack Quiz:x86 Assembly 2  (0) 2022.08.25
반응형

소스코드

더보기
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
#include <stdio.h>
 
int main(){
    int a;
    scanf("%d",&a);
    
    switch(a){
        case 1:
        case 2:
        case 12:
            printf("winter"); break;
        case 3:
        case 4:
        case 5:
            printf("spring"); break;
        case 6:
        case 7:
        case 8:
            printf("summer"); break;
        case 9:
        case 10:
        case 11:
            printf("fall"); break;
    }
    return 0;
}
 
cs
반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

Codeup Q.1106 C언어  (0) 2022.08.25
Codeup Q.1089 C언어  (0) 2022.08.25
Codeup Q.1083 C언어  (0) 2022.08.23
Codeup Q.1087 C언어  (0) 2022.08.23
반응형

 

소스코드

더보기

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main(){
    int i;
    int num;
    scanf("%d",&num);
    for(i=1; i<=num; i++){
      if(i%3==0)  printf("X ");
      else printf("%d ",i);
    return 0;
    }
}
 
cs

반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

Codeup Q.1089 C언어  (0) 2022.08.25
Codeup Q.1070 C언어  (0) 2022.08.24
Codeup Q.1087 C언어  (0) 2022.08.23
Codeup Q.1085 C언어  (0) 2022.08.22
반응형

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(){
    int n, i, s=0;
scanf("%d"&n);
for(i=1; ; i++
{
  s+=i;
  if(s >= n) break
}
printf("%d\n", s);
    return 0;
}
 
cs
반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

Codeup Q.1070 C언어  (0) 2022.08.24
Codeup Q.1083 C언어  (0) 2022.08.23
Codeup Q.1085 C언어  (0) 2022.08.22
아두이노 온도 lcd 패널에 출력 및 릴레이 작동  (0) 2022.08.20
반응형

codeup1085

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(){
    int h,b,c,s;
    double sum;
    scanf("%d %d %d %d",&h,&b,&c,&s);
    sum = (double)(h*b*c*s)/(2<<22);
    printf("%.1lf MB",sum);
    return 0;
}
 
cs
반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

Codeup Q.1083 C언어  (0) 2022.08.23
Codeup Q.1087 C언어  (0) 2022.08.23
아두이노 온도 lcd 패널에 출력 및 릴레이 작동  (0) 2022.08.20
codeup Q.1805 C언어  (0) 2022.08.18
반응형

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
 
#define DHTPIN 2
#define DHTTYPE DHT22
 
DHT dht(DHTPIN, DHTTYPE);
 
LiquidCrystal_I2C lcd(0x27162);
 
const int Htmp = 35//최고 온도
const int Mtmp = 25//중간 온도
const int Ltmp = 15//낮은 온도
int RelayP = 3;
 
float Tc; //현재 온도 상태
 
 
void setup() {
  Serial.begin(9600);
  dht.begin();
 
 
 
  pinMode(RelayP, OUTPUT);
 
  lcd.init();
  lcd.backlight();
}
 
void loop() {
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  delay(1000);
 
  Tc = (int)temperature;
 
 
  if ( Tc <= Htmp && Tc != 0) {
    digitalWrite(RelayP, HIGH);
  } else {
    digitalWrite(RelayP, LOW);
  }
 
 
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" %");
 
  String humi = "Humi : ";
  humi += (String)humidity;
  humi += "%";
 
  String temp = "Temp : ";
  temp += (String)temperature;
  temp += "C";
 
 
 
  lcd.setCursor(00);
  lcd.print(humi);
 
  lcd.setCursor(01);
  lcd.print(temp);
 
  delay(1500);
}
 
cs
반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

Codeup Q.1087 C언어  (0) 2022.08.23
Codeup Q.1085 C언어  (0) 2022.08.22
codeup Q.1805 C언어  (0) 2022.08.18
콤마로 구분된 숫자들의 합을 구하기  (0) 2021.12.04
반응형

codeup 1028번

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
import java.util.Scanner;
 
public class Main{
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        long n = s.nextLong();
        
        System.out.println(n);
    }
}
 
cs

 

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

Java Codeup [1017]~[1027]  (0) 2021.05.15
Java codeup [1010]~[1015]  (0) 2021.05.11
Java codeup [1001]~[1008]  (0) 2020.09.12
반응형

codeup 1805


C언어 코드

더보기
1
2
3
4
5
6
7
8
9
12
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 100
 
struct Machine {
    int num;
    long gas;
};
 
int main() {
    int n = 0;
    scanf("%d"&n);
 
    struct Machine machine[SIZE];
    struct Machine tmp;
 
    for (int i = 0; i < n; i++) {
        scanf("%d %ld"&machine[i].num , &machine[i].gas);
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i-1; j++) {
            if (machine[j].num > machine[j + 1].num) {
                tmp.num = machine[j].num;
                tmp.gas = machine[j].gas;
                machine[j] = machine[j + 1];
                machine[j + 1].num = tmp.num;
                machine[j + 1].gas = tmp.gas;
            }
        }
    }
 
    for (int i = 0; i < n; i++) {
        printf("%d %ld\n", machine[i].num, machine[i].gas);
    }
 
    return 0;
}
 
cs

 

반응형
반응형

Q 01. 다음 중 컴퓨터와 관련 없는 것을 하나 골라보세요.

프로그래밍 언어, 소프트웨어, 앱, 프로그래머, 사람의 언어

A : 사람의 언어

 


 

Q 02. 다음 중 프로그래밍 언어가 아닌 것을 하나 골라보세요.

파이썬, 자바, B++, C, HTML, PHP

A : B++
※ HTML은 프로그래밍 언어보다는 마크업 언어이지만 책에서는 이해를 돕기 위해 프로그래밍 언어라고 한 것 같습니다

 


 

Q 03. 파이썬의 특징에 대한 설명 중 틀린 것을 모두 골라보세요.
① 프로그래밍 언어이다.
② 비단뱀이라는 단어 뜻을 가지고 있다.
③ 귀도 반 로섬이라는 프로그래머가 만들었다.
④ 다른 프로그래밍 언어에 비해서 가장 전통이 오래된 언어이기 때문에 그 기능이 막강하다.
⑤ 개인에게 상당히 인기가 있지만, 기업 시장에는 아직 진출하지 못했다.
⑥ 개인 사용자에게는 무료이지만, 학교/기업 등은 유료로 사용해야 한다.

A : ④, ⑤, ⑥

 


 

Q 04. 파이썬 설치에 대한 내용 중 틀린 것을 모두 골라보세요.
① 윈도우용의 설치 파일의 확장자는 exe이다.
② 설치 과정이 매우 간단하다.
③ 윈도우, 맥, 리눅스 등에 모두 설치할 수 있다.
④ 64비트 윈도우에는 32비트용 파인썬을 설치할 수 없다.
⑤ 32비트 윈도우에는 64비트용 파이썬을 설치할 수 없다.
⑥ 설치 과정에서 설치되는 폴더를 바꿀 수 없다.

A : ④, ⑥

 


 

Q 05. 다음과 같은 결과가 나오도록 프로그램을 코딩해보세요.

아··· 문제 어렵네요 ㅠㅠ

A : print("아··· 문제 어렵네요 ㅠㅠ")

 


 

Q 06. 다음 코드의 결과를 쓰세요(함정이 있으니 조심하세요. ^^).

print("11+22-33")
print(안녕?)

A : 11+22-33 , 오류

반응형

 

반응형

+ Recent posts