이 문제는 리눅스에서 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의 각 항목들은 : (콜론)으로 구분해줄 수 있다.







+ Recent posts