이 문제는 리눅스에서 apt-get 명령어를 사용할 때 발생합니다.


실제 발생 에러 내용입니다.

E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily unavailable)

E: Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?


저는 python-pip를 설치하려고 했을 때 발생을 했구요.

해당 경로로 접근을 했을 때 dpkg파일에 락이 걸려있는 것을 볼 수 있습니다.



이 때 rm명령어를 이용해서 dpkg 파일의 옵션을 이용하면 해결할 수 있습니다.

rm /var/lib/dpkg/lock; dpkg --configure -a




저작자 표시 비영리 변경 금지
신고
리눅스와 같은 Text UI환경에서는 특정 파일들만 골라서 삭제하기가 까다롭습니다.

rm 명령어와 |grep 의 조합으로 가능할까 싶었는데 find 명령어를 이용하여 가능했습니다.

find . -name "*pwnbit.kr*" -exec rm -f {} \;

find 명령어를 이용하여 특정 파일명을 검색합니다. 이때 파일명은 보시듯이 정규표현식 사용이 가능합니다.

그리고 -exec옵션을 이용하여 이를 이용하여 실행할 프로그램을 지정해줍니다.
여기서는 파일 삭제를 위해서 rm을 사용했고, {}는 find에 대한 결과 한 줄 마다 rm을 실행하겠다는 의미입니다.

하지만 exec에 대한 인자를 찾지 못 했다는 에러메시지가 발생했는데요.
exec에 대한 인자를 찾지 못했다고 나오는 경우에는 -exec rm {} \;에서 {}와 \사이에 공백을 한 칸 넣어주셔야 합니다.
이런 주의사항들 대신에 더 편한 방법으로는 -exec 옵션 대신 -delete 옵션을 사용하면 됩니다.

find . -name "*pwnbit.kr*" -delete

exec 옵션을 사용하는 것보다 더 깔끔해 보입니다.

옵션 하나만 알고있었어도, find --help를 쳐보기만 했어도 금방 해결할 간단한 문제였는데 아까운 시간만 버렸네요.




저작자 표시 비영리 변경 금지
신고

환경(Environment) : Ubuntu 14.04 (Voyager)


문제(Problem) : 프로그램 실행 시 공용 라이브러리 libstdc++.so.6을 찾을 수 없는 문제

error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory


원인(Cause) : 프로그램 실행에 32비트 라이브러리가 필요 (need 32bit library)


해결 방법(Solution) : sudo apt-get install lib32ncurses5 lib32stdc++6




written by Ubuntu 14.04 (Voyager)








저작자 표시 비영리 변경 금지
신고

Socket을 이용하는 Remote BOF 공격에서 대게 Bind Shell Code를 사용하게 된다.

이 쉘코드가 어떻게 구성되어있고, 왜 Remote BOF에서는 Bind Shell Code를 써야하는지 알아보았다.


1. Bind Shell Code의 구성

우선 통신을 위해 TCP와 같이 구성이 된다.

Socket() -> Bind() -> Listen() -> Accept()

또한 표준입출력을 위해 dup2함수와 쉘을 띄우기 위한 execve함수로 구성할 수 있다.


2. Bind Shell Code의 목적

Remote 환경에서는 쉘이 소켓이 종료된 뒤에 떨어지기 때문에 이 통신을 유지시켜줄 필요가 있다. 따라서 Bind Shell Code를 이용하여 포트를 열고 쉘을 받아오는 것이다. 하지만 소켓을 통해서는 서버에서 사용되는 표준입출력을 받을 수 없기 때문에 dup2 함수가 사용된다. 

이 함수는 사용자가 원하는 파일 디스크립터를 복사할 수 있게 해주는 역할을 한다.

즉, Socket()를 사용할 때 생성된 소켓의 파일 디스크립터 번호에 표준입출력 번호를 할당해 줌으로써 소켓을 통해서 쉘코드를 표준입력으로 전달하고 그 결과 얻은 쉘을 표준출력으로 돌려받을 수 있게 되는 것이다.


※ 파일 디스크립터 : 파일을 관리하기 위해 운영체제가 할당하는 번호로 0/1/2의 고정된 번호가 있으며 이 이후부터 순차적으로 번호가 매겨지게 된다. 주로 Open()함수를 통해 파일을 생성하거나 Socket()로 소켓을 생성할 때도 번호가 붙게 된다.


※ 파일 디스크립터에 고정적으로 할당된 표준입출력 번호

표준 입력 : 0

표준 출력 : 1

표준 에러 : 2

(해커스쿨 문제를 풀면서 2 > /dev/null 를 쓰면 에러가 안 보이는 이유이다.)


3. Assembly Code

dup2(int s_fd, int d_fd)로 구성이 되는데 인자는 각각 순서대로 ebx, ecx에 들어가게 된다.

실제 Bind Shell Code를 구성하는 다음 코드를 보면 이해에 도움이 될 것 같다.

  xchg eax, ebx               ; 소켓 파일디스크립터를 ebx에 저장
  push BYTE 0x2
  pop ecx                        ; ecx를 표준에러(2)부터 소켓 파일 디스크립터에 복사
dup_loop:
  mov BYTE al, 0x3F          ; dup2() 시스템콜 63(0x3F)
  int 0x80                          ; 시스템 콜 호출
  dec ecx                         ; ecx--(표준에러 / 표준출력 / 표준입력 순으로 복사 됨)
  jns dup_loop                  ; ecx가 음인 경우 부호플래그가 참이 되어 루프 종료

 

원본출처 : http://inhack.org/wordpress/?p=2502

 

생성된 소켓의 파일 디스크립터를 ebx에 넣어 dup2의 인자로 사용하고 ecx에서 2번(에러출력)부터 0번까지 루프를 돌면서 파일 디스크립터를 복사해준다.

 

이 과정을 거치기 때문에 Bind Shell Code 사용 시에 소켓을 통해서도 표준 입출력을 전달 받고 쉘을 얻을 수 있게 된다. = )







저작자 표시 비영리 변경 금지
신고

리눅스 명령어를 못 찾을 경우 다음과 같은 명령어로 찾아볼 수 있다.

 

find / -name *****

*****에는 찾고자 하는 명령어를 검색하면 되며 대게 /sbin 폴더안에서 찾을 수 있다.

 

해당 명령을 PATH에 등록시켜 사용해야하므로

 

env 명령어로 현재 등록되어 있는 환경변수 목록에서 PATH 항목을 찾아본다

 

현재 PATH항목 부분을 복사해둔 뒤 다음 명령어로 수정해서 추가시켜준다.

 

export PATH=기존에 있던 PATH항목들:/sbin

 

PATH의 각 항목들은 : (콜론)으로 구분해줄 수 있다.







저작자 표시 비영리 변경 금지
신고
어셈블리 명령어 상세  -  명령어의 분류

① 데이터 이동 : mov, lea

② 논리, 연산 : add, sub, inc, dec
③ 흐름제어 : cmp,jmp
④ 프로시져 : call, ret
⑤ 스택조작 : push, pop
⑥ 
인터럽트 : int

1) 데이터 이동

1. mov (move data)


- 형식 : mov SOURCE, DESTINATION

- 기능 : SOURCE위치에 들어있는 데이터를 복사하여 DESTINATION위치에 저장.
- 원칙 : 메모리와 레지스터(모든 연산은 레지스터에 저장된뒤 이루어진다.) 사이의 데이터이동, 레지스터와 레지스터 사이의 데이터 이동이나 값을 메모리나 레지스터에 대입할 때 사용한다. (SOURCE와 DESTINATION의 크기가 동일해야 한다.)

# DESTINATION레지스터가 CS가 될수 없다.(프로그램실행위치가 변경되기때문)(CS의 변경은 int, jmp, call, ret등의 명령으로 가능)
# SOURCE와 DESTINATION이 전부 메모리를 가르칠수 없다. (설계상 불가능)
# SOURCE가 직접지정방식일경우에는 DESTINATION은 CS일 수 없다.

2. lea

- 형식 : lea SOURCE, DESTINATION
- 기능 : SOURCE OPERAND에서 지정된 주소를 DESTINATION으로 로드한다. LEA의 주된 용도는 매개변수나 지역변수의 주소를 얻어오는 것이다. 예를 들어C언어에서 지역변수나 매개변수에&연산자를 사용한다면 컴파일러는 lea명령어를 생성한다.
- 원칙 : SOURCE OPERAND는 메모리에 위치해야하며, 변경될 주소는 index register나 DESTINATION에 정의된 주소여야 한다.

2) 논리, 연산 : add, sub, inc, dec

ㄱ. add

  - 형식 : add opr1, opr2
  - 기능 : opr2의 내용에 op1의 내용이 더해져서 그 결과를 opr2에 저장.
  - 원칙 : ! 두 개의 오퍼랜드 모두에 메모리로 조합되는 것은 불가능.

ㄴ. sub (subtract)

  - 형식 : sub opr1, opr2
  - 기능 : 첫번째 오퍼랜드로 부터 2번째 오퍼랜드 의 내용을 뺀 다음 결과를 첫 번째 오퍼
  - 원칙 : ! 메모리끼리는 뺄셈을 할수 없다.

ㄷ. inc (Increment)

  - 형식 : inc DESTINATION
  - 기능 : DESTINATION을 1 증가시키고 결과값을 다시 저장

ㄹ. dec (decrement)

  - 형식 : dec DESTINATION
  - 기능 : DESTINATION을 1 감소시키고 결과값을 다시 저장

3) 흐름 제어 : jmp, cmp

1. jmp

- 형식 : jmp proc

- 기능 : 프로그램의 흐름을 바꿀 때 사용. proc의 주소로 가서 그곳의 명령어를 실행.
if/else문, loop문(루프가 아직 끝나지 않았을때, 처음위치로 돌아가기 위해)
등에서 나타난다.

2. cmp

- 형식 : cmp value, value
ex1) cmp %eax, 0 (eax레지스터의 값을 0과 비교한다.)
ex2) je start (비교 결과가 같다면 start로 분기한다. 같지 않다면 je 다음에 오는 명령어를 실행한다.)

- 기능 : 두값을 비교하고 비교결과에 따라 분기한다. 보통 레지스터나 메모리 및 숫자의 크기를 비교한다.
cmp 명령어는
Zero, Sign, Overflow 등의 플래그를 set or clear 한다. 이 플래그의 결과에 의해서 Jcc 명령어들은 분기할 것인지를 결정한다. 보통 CMP 명령어 다음에 JE, JNE 등의 jmp관련 명령어가 위치한다.
- 원칙 : cmp 명령은 혼자 사용되지 않고 언제나 조건 점프 명령어나 조건 이동(mov) 명령어와 함께 사용된다.
-조건 점프 명령어:cmp 명령어의 결과에 따라 점프하는 명령어.

************************** 참고 **************************

[+] Unsigned 계열 (부호가 없는 값)
je : jump equal - 비교 결과가 같을 때 점프
jne : jump not equal - 비교 결과가 다를 때 점프
jz : jump zero - 결과가 0일 때 점프, je와 같음. (cmp 명령에서 결과가 같으면 0을 출력)
jnz : jump not zero - 결과가 0이 아닐 때 점프
ja : jump above - cmp a, b에서 a가 클 때 점프
jae : jump above or equal - 크거나 같을 때 점프
jna : jump not above - 크지 않을 때 점프
jnae : jump not above or equal - 크지 않거나 같지 않을 때 점프
jb : jump below - cmp a, b에서 a가 작을 때 점프
jbe : jump below or equal - 작거나 같을 때 점프
jnb : jump not below - 작지 않을 때 점프
jnbe : jump not below or equal - 작지 않거나 같지 않을 때 점프
jc : jump carry - 캐리 플래그가 1일 때 점프
jnc : jump not carry - 캐리 플래그가 0일 때 점프
jnp/jpo : jump not parity / parity odd - 패리티 플래그가 0일 때 / 홀수일 때 점프
jp/jpe : jump parity / parity even - 패리티 플래그가 1일 때 / 짝수일 때 점프
jecxz : jump ecx zero - ecx 레지스터가 0일때 점프

[+] Signed 계열 (부호가 있는 값)

jg : jump greater - cmp a, b에서 a가 클 때 점프
jge : jump greater or equal - 크거나 같을 때 점프
jng : jump not greater - 크지 않을 때 점프
jnge : jump not greater or equal - 크지 않거나 같지 않을 때 점프
jl : jump less - cmp a, b에서 a가 작을 때 점프
jle : jump less or equal - 작거나 같을 때 점프
jnl : jump not less - 작지 않을 때 점프
jnle : jump not less or equal - 작지 않거나 같지 않을 때 점프
jo/jno : jump overflow / not overflow - 오버플로 플래그가 1일 때 / 0일 때 점프
js/jns : jump sign / not sign - 사인(부호) 플래그가 1일 때(음수) / 0일 때(양수) 점프
조건 점프 명령을 조합하여 if ( a > b ), for, while등의 조건문 구현
********************************************************

4) 프로시져 : call, ret

1. call

- 형식 : call Target
- 기능 : 스택 상에서 CS를 다음에 오는 명령의 오프셋 어드레스를 PUSH하고 target으로 이동한다. 즉, 다른 함수로 제어를 옮긴다는 뜻이다. CALL 명령어 다음에 오는 명령어의 주소를 스택에 PUSH하고 주어진 주소로 제어를 옮긴다는 뜻(EIP를 변경시킴)

# CALL명령은 CALL명령 다음위치에 있는 명령의 주소를 스택에 push한다.

2. ret (return)

- 형식 : ret

- 기능 : 호출된 함수에서 호출한 함수로 복귀. esp에 있는 값을 꺼내서(pop) EIP레지스터에 할당한다. 즉, call명령 당시 push되었던 주소를 pop하여 eip에 넣는 것이다.

5) 스택조작 : push, pop

1. pop

- 형식 : pop DESTINATION

- 기능 : 스택 맨 윗부분(top)에서 하나의 워드를 DESTINATION에 로드(load).
그리고 스택포인터는 그 바로 전의 데이터를 가리킨다(point).

2. push

- 형식 : push DESTINATION
- 기능 : 메모리상에 설정된 스택이라는 공간에 데이터를 저장한다. 스택의 가장 윗부분에 데이터를 저장.
스택 포인터(esp)도 워드크기만큼 증가한다.

6) 인터럽트 : int

- 형식 : int (interrupt-type)

- 기능 : 운영체제에 할당된 인터럽트 영역을 system call.


/** 아래는 출처 입니다. **/
//////////////////////////////////////////////////////////////////////////////////////////
작성자 : bOBaNa

E-mail : zeroone2000@korea.com
작성일 : 2007년 3월 30일

Parse and Parse Assembly

(어셈블리어 입문자를 위한
어셈블리어 자료들의 모음)

에서 가져온 내용입니다. 원작자분께 감사의 뜻을 전합니다.
//////////////////////////////////////////////////////////////////////////////////////////







저작자 표시 비영리 변경 금지
신고

에그쉘(Eggshell)이란 딱 봐도 계랸껍질이라는 말이지만 BOF에서는 버퍼의 크기가 쉘코드의 크기보다 작아서 쉘코드를 써넣을 수 없을 때 환경변수에 쉘을 등록해놓고 그 주소값만 가져와서 쉘을 띄울 수 있게 해주는 프로그램이다.

하지만 에그쉘은 환경변수에 등록 후 등록된 주소의 값을 불러오는 프로그램(getegg)을 작성 해야 제대로 쓸 수 있다.

에그쉘 코드 작성 후 한번 실행하여 "EGG"라는 이름으로 쉘코드를 환경변수에 넣어줘야 getegg로 Eggshell의 주소를 가져올 수 있다.

 

주의할 점 : 에그쉘 소스를 바로 vi 편집기에 붙여넣으려고하면 깨진 상태에서 붙여넣기가 되고 컴파일도 제대로 되지 않는다. 붙여넣기 전에 :set paste 로 설정을 바꿔줘야 제대로 붙여넣기가 되고 컴파일 시에도 에러가 나지 않는다.

 

Eggshell과 getegg 소스코드

 

Eggshell 바로보기

 

EGG Shell.c

 

 

getegg 바로보기

 

getegg.c







저작자 표시 비영리 변경 금지
신고

INC(Increase) : 피연산자에 1을 더한다. ZF, OF가 세트될 수 있다.  

ex) INC reg

DEC(Decrease) : 피연산자에 1을 뺀다. ZF, OF가 세트될 수 있다.   

ex) DEC reg

ADD(Add) : Destination에 Source의 값을 더해서 Destination에 저장하는 명령이다. ZF, OF, CF가 세트될 수 있다.    

ex) ADD eax, 123         => eax 레지스터에 123을 더해서 eax 레지스터에 저장한다.


SUB(Subtract) : Destination에 Source에 값을 빼서 Destination에 저장하는 명령이다.

                       ZF, OF, CF가 세트될 수 있다.            

ex) SUB eax, 123         => eax 레지스터에 123을 빼서 eax 레지스터에 저장한다.

 

MUL(Unsigned Integer Multiply) : 부호 없는 al, ax, eax의 값을 피연산자와 곱한다. OF, ZF가 세트될 수 있다.

피연산자가 8비트이면 al과 곱해서 ax에 저장되고 16비트이면 ax와 곱하고 dx:ax에 저장된다.

ex) MUL reg

IMUL(Integer Muiltiplication) : 부호 있는 al, ax, eax의 값을 피연산자와 곱한다. CF, OF가 세트될 수 있다.
ex) IMUL r/m8
      IMUL r/m16
      IMUL r/m32          => 단일 피연산자이고 피연산자를 al, ax, eax에 곱한다.
ex) IMUL destination, value
      IMUL r16, r/m16    => value를 al, ax, eax와, 곱해서 destination에 저장한다.
ex) IMUL destination, value, value
      IMUL r16, r/m16, imm8  => value끼리 곱해서 destination에 저장한다.
      연산 결과가 destination 레지스터의 크기보다 크다면 OF, CF가 세트된다.

DIV(Unsigned Integer Divide) : 8, 16, 32비트 부호 없는 정수의 나눗셈을 수행한다. CF, OF, ZF가 세트될 수 있다.
ex) DIV reg

MOV(Move) : Source에서 Destination으로 데이터를 복사한다.
ex) MOV Destination, Source
      MOV reg, reg

MOVS(Move String) : Source에서 Destination으로 데이터를 복사한다.
ex) MOVS Destination, Source

MOVSB, MOVSW, MOVSD(Move String): SI 또는 ESI 레지스터에 의해 지정된 메모리 주소의 내용을 DI 또는 EDI 레지스터에 의해 지정되는 메모리 주소로 복사한다.
MOVSB는 BYTE단위로 복사, MOVSW는 WORD단위로 복사, MOVSD는 DWORD단위로 복사한다.
방향 플래그(DF)가 1로 세트되어 있으면 ESI와 EDI는 복사 시에 감소하게 되고 DF가 0으로 세트되어 있으면 ESI와 EDI는 복사 시에 증가하게 된다.

MOVSX(Move with Sign-Extend) : BYTE나 WORD 크기의 피연산자를 WORD나 DWORD 크기로 확장하고 부호는 그대로 유지한다.
ex) MOVSX reg32, reg16  => reg16을 확장하여 reg32에 복사

MOVZX(Move with Zero-Extend) : BYTE나 WORD 크기의 피연산자를 WORD나 DWORD 크기로 확장하고 남은 비트는 0으로 채운다.
ex) MOVZX reg32, reg16  => reg16을 확장해서 남은비트를 0으로 채운후 reg32에 복사

 

INT(Interrupt) : 소프트웨어 인터럽트를 발생시켜 운영체제의 서브루틴을 호출한다.
ex) INT imm

AND(Logical AND) : Destination과 Source 피연산자의 각 비트가 AND 연산된다. 

                             각 비트가 모두 1일때만 1 OF, CF가 0으로 세트, ZF가 1로 세트될 수 있다.

OR(Inclusive OR) : Destination과 Source 피연산자의 각 비트가 OR 연산된다.
                            각 비트가 모두 0이면 0이고 모두 0이 아니면 1이다.

                            OF, CF가 0으로 세트, ZF가 1로 세트될 수 있다.

XOR(Exclusive OR) : Destination과 Source 피연산자의 각 비트가 XOR 연산된다.
                               각 비트가 서로 다른 값을 때만 1, 같은 값이라면 0.
                               OF, CF가 0으로 세트, ZF가 1로 세트될 수 있다.
                               레지스터를 0으로 초기화시킬 때 MOV 명령어를 사용하기 보단 XOR reg, reg으로 많이 사용

TEST(Test) : 두 피연산자 사이에 논리적인 AND 연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다. OF, CF는 항상 0으로 세트, TEST 연산 결과값이 0이면 ZF가 1로 세트, 0이 아니면 ZF가 0으로 세트된다.
ex) TEST reg, regTEST reg, imm

STC(Set Carry Flag) : 캐리 플래그(CF)를 1로 세트한다.

CLC(Clear Carry Flag) : 캐리 플래그(CF)를 0으로 세트한다.

STD(Set Direction Flag) : 방향 플래그(DF)를 1로 세트한다.

CLD(Clear Direction Flag) : 방향 플래그(DF)를 0으로 세트한다.

STI(Set Interrupt Flag) : 인터럽트 플래그(IF)를 1로 세트한다.

CLI(Clear Interrupt Flag) : 인터럽트 플래그(IF)를 0으로 세트한다.

SHL(Shift Left) : Destination 피연산자를 Source 피연산자의 크기만큼 왼쪽으로 각 비트를 시프트시킨다.
                        최상위 비트는 캐리 플래그(CF)로 복사되고 최하위 비트는 0으로 채워진다.
ex) SHL reg, imm8SHL mem, imm8

SHR(Shift Right) : Destination 피연산자를 Source 피연산자의 크기만큼 오른쪽으로 각 비트를 시프트 시킨다.
                          최상위 비트는 0으로 채워지고 최하위 비트는 캐리 플래그(CF)로 복사된다.
ex) SHR reg, imm8SHR mem, imm8

PUSH(Push on Stack) : 스택에 값을 넣는다. ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다.
ex) PUSH reg16

PUSHAD(Push ALL) : EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터의 값을 스택에 PUSH한다.
                               레지스터들의 값을 보관해야 할 필요가 있을 때 사용한다.

PUSHFD(Push Flags) : 플래그 레지스터를 스택에 PUSH한다.
                                  플래그 레지스터의 값을 보관해야 할 필요가 있을 때 사용한다.

POP(Pop from Stack) : ESP 레지스터가 가리키고 있는 위치의 스택 공간에서 4byte 만큼을 Destination 피연산자에 복사하고 ESP 레지스터의 값에 4를 더한다.

 

POPAD(Pop All Flags from Stack) : 스택에 존재하는 값을 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터로 POP한다.  스택에 보관해 놓은 레지스터 정보를 다시 이용하려고 할 때 사용.

POPFD(Pop Flags from Stack) : 스택에 존재하는 값을 플래그 레지스터로 POP한다.
                                             스택에 보관해 놓은 레지스터 정보를 다시 이용하려고 할 때 사용한다.

XCHG(Exchange) : 두 피연산자의 내용이 서로 교환된다. imm 값이 피연산자로 올 수 없다.

NEG(Negate) : 피연산자의 2의 보수를 계산하여 결과를 피연산자에 저장한다.

PTR : 피연산자의 크기를 재설정한다.
ex) MOV eax, DWORD PTR value    => value의 크기를 DWORD 크기로 재설정하여 eax 레지스터에 복사

OFFSET : 세그먼트의 시작으로부터 변수가 위치한 거리까지의 상대적 거리를 리턴한다.
ex) MOV esi, OFFSET value   => value가 존재하는 위치를 세그먼트 시작 지점부터의 상대적 거리를 구해서 esi 레지스터에 복사하라는 의미.

LEA(Load Effective Address) : Source 피연산자의 유효 주소를 계산하여 Destination 피연산자에 복사한다. 간단히 주소를 알아내서 복사하는 명령어라고 생각하면 쉽다.

REP(Repeat String) : ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX>0인 동안 반복
ex) REP MOVS destination, source

JMP(Jump Unconditionally to Lable) : 피연산자의 위치로 실행 흐름이 변경된다. 피연산자가 가리키는 코드로 점프 뛰어서 실행한다고 생각하면 된다. 피연산자에는 레이블이나 레지스터, 메모리 값이 올 수 없다.

CALL(Call a Procedure) : 함수 호출시 사용. JMP 명령어 같이 프로그램의 실행 흐름이 변경되지만 JMP 명령어와 다른 점으 되돌아올 리턴 어드레스(CALL 다음 명령)를 스택에 저장한다는 것이다. 그렇기 때문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있다.

CMP(Compare) : 두 피연산자를 비교하는 작업. Destination 피연산자에서 Source 피연산자를 묵시적으로 빼서 값을 비교한다. 두 피연산자의 값으 같다면 0, ZF가 1로 세트된다. 다르다면 ZF는 0으로 세트된다.

NOP(No Operation) : 아무 일도 하지 않는 명령어이다.

 






저작자 표시 비영리 변경 금지
신고

 

putty와 함께 원격 접속 프로그램으로 많이 쓰이는 Xshell에서는 백스페이스를 입력 시 아래와 같이 ^H 문자가 입력됩니다.

저는 주로 리눅스나 텔넷 접속을 쓰지만 솔라리스 환경에서도 같은 현상이 생긴다고 하네요.

이럴 때는 Ctrl + Backspace를 눌러야 정상적으로 지워지는 불편함이 있는데 Xshell의 옵션 설정만 바꿔주면 간단하게 해결됩니다.

 

 

 

이때는 세션 등록정보창에서 키보드 옵션을 Backspace에서 ASCII 127로 바꿔주면 정상적인 백스페이스 작동이 됩니다. = )

 


 







저작자 표시 비영리 변경 금지
신고

+ Recent posts

티스토리 툴바