DAY_33 CGI

2021. 2. 9. 18:19

체크리스트

● 아파치 웹서버의 지시어에 대하여 답하시오.

User : 아파치 웹서버를 실행시킬 사용자를 설정하는 지시어

Group : 아파치 웹서버를 실행시킬 그룹을 설정하는 지시어

ServerAdmin : 관리자 이메일

ServerName : 서비스하는 도메인명을 설정하는 지시어

ServerAlias : 서비스하는 2차 도메인명을 설정하는 지시어

UserDir : 사용자 홈디렉터리를 서비스하는 지시어 http://도메인orIP주소/~사용자/

ErrorLog : 에러 로그가 기록될 위치를 지정하는 지시어

CustomLog : 웹페이지 접근 시에 정상/에러 로그가 기록되는 경로를 설정하는 지시어

DirectoryIndex : 클라이언트에게 전송하는 웹문서를 설정하는 지시어

Files : 웹 서버에 업로드 된 파일을 접근 가능 불가능

DocumentRoot : 웹 페이지가 제공되는 디렉터리를 설정하는 지시어

Include : 다른 설정파일들을 포함시키는 지시어

Listen : 아파치가 가동 될 동안 사용할 포트번호를 의미한다. 

ServerTokens : 서버와 웹서버의 버전 정보를 출력하는 지시어

 

● 가상호스트란 무엇인가 ?

- 하나의 ip안에 여러 호스트(도메인)를 만들어 사용하는 것이다.

● 아파치 웹서버에서 가상호스트가 필요한 이유는 무엇인가 ?

- 하나의 ip안에서 여러 사용자를 만들어 사용성을 증가 시킬수 있다. 

● .htaccess 파일이란 무엇인가 ?

- 아파치 웹서버 접근 제어 파일이다.

● .htpasswd 파일이란 무엇인가 ?

- 아파치 웹서버 접근 제어에 대해 사용자와 비밀번호를 설정해 놓는 파일이다.

● htpasswd 명령어를 이용해서 로그인 사용자 user1을 생성하는 명령어는 무엇인가 ?

- htpasswd -c .htpasswd user1

● <Directory> 컨테이너란 무엇인가 ?

- apache가 접근할 수 있는 디렉터리에 대해 어떠한 기능과 
허용할 것인지 거부할 것인지가 나타나있다.

● 아파치 웹서버에서 apache 웹 사용자가 웹 문서를 클라이언트에게 전달하기 위한 조건은 무엇인가 ?

- 사용자의 웹문서에 접근할 수 있어야 한다. (퍼미션 + SELinux context)

● 시스템에서 nobody, apache, daemon 사용자는 어떤 사용자인가 ?

- 아파치 웹서버의 클라이언트에게 웹 문서를 제공하는 웹 사용자

● httpd -l 옵션은 무엇인가 ? 

- 컴파일된 모듈을 확인하는 명령어이다.

● httpd -t 옵션은 무엇인가 ?

- 아파치 웹서버 설정 파일의 문법을 검사하는 옵션

● httpd -S 옵션은 무엇인가 ?

- 설정된 가상호스트의 정보를 보여주는 것이다.

 

● 아래의 <Directory> 컨테이너에서 Require all granted 의 의미는 무엇인가 ?

<Directory "/var/www/html">

Options Indexes FollowSymLinks

AllowOverride None

Require all granted

</Directory>

- /var/www/html 디렉터리에 대해서 전체 접근(모든 ip)을 허용

 

● 아래의 <Directory> 컨테이너에서 Require all denied 의 의미는 무엇인가 ?

<Directory "/var/www/html/files">

Options Indexes FollowSymLinks

AllowOverride None

Require all denied

</Directory>

- /var/www/html/files 디렉터리에 대해서 전체 접근을 거부

● ServerTokens 지시어의 설정값 중에서 웹서버 이름만 출력하는 옵션은 무엇인가 ?

- Prod

● 아파치에서 특정 디렉터리 이하를 인증을 걸고 싶을 때 아파치 인증을 설정하는 방법은 무엇인가 ?

- .htaccess 파일에서 AuthUserFile 정보를 설정해줘야한다. 


실습 > Alias 지시어

 

ScriptAlias : CGI를 사용하는 지시어

CGI() : 공통 게이트웨이 인터페이스, 웹서버와 외부 프로그램 사이에서 정보를 주고 받는 방법이나 규약

 

CGI 프로그램은 예전에 PHP전에 사용했던 웹 프로그래밍 방법

 

cgi 사용했던 언어 : C, perl

 

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

web1# cd /var/www/cgi-bin

 

web1# vi index.c

-- index.c --
/*
 * 파일명 : index.c
 * 프로그램 설명 : CGI 테스트 프로그램
 */

#include <stdio.h>

int main()
{
    printf("Content-type: text/html\r\n\r\n");
    printf("<html>"
           "<head>"
           "<meta charset=utf-8>"
           "<title> Hello CGI </title>"
           "</head>"
           "<body>"
           "<center> <font color=blue size=7> Hello CGI!!! </font> </center>"
           "</body>"
           "</html>");

    return 0;
}
-- index.c --

web1# gcc -o index.cgi index.c

 

http://sbs.com/cgi-bin 

web1 # vi index2.cgi

-- index2.cgi --
#!/usr/bin/env python3
"""
파일명 : index2.cgi
프로그램 설명 : Python CGI 프로그램
"""

head = """
<html>
<head>
 <meta charset='utf-8'>
 <title> Python CGI </title>
</head>
<body>
"""

tail = "</body></html>"

print("Content-type: text/html\r\n\r\n")
print(head)
print("Hello python!")
print(tail)
-- index2.cgi --

 

 

특별한 경우가 아니라면 cgi는 막아둬야한다.

web1# systemctl restart httpd

막혀있는것을 확인할 수 있다.


 

파일 수정 중 혹은 백업파일 생성시 DB정보 / 중요정보 노출

 

1. 스왑파일 접근

관리자가 vi로 index.html 파일을 열면 스왑 파일이 생기고 수정하는 순간 

그 내용이 스왑파일로 저장되므로 클라이언트에서 .index.html.swp 페이지로 접근하면 DB정보의 내용이 출력된다.

 

php정보는 기본적으로 웹 소스, 브라우저 상에 보이지 않게 된다.

하지만 이를 수정중에 생기는 swp을 보면 php정보가 그대로 보이게 된다.

 

sbs.com/.index.html.swp

 

Files 지시어로 swap 파일

스왑 파일 접근 금지

vi /etc/httpd/conf/httpd.conf

# 스왑파일은 *.swp, *.swo ... 이므로 ?(한문자)를 사용해야 모든걸 커버할 수 있다.

만약에 swo도 생길 수 있어서

 

2. 백업파일을 만들경우

만약사용자가 파일을 만들고 백업용으로 index.html.bak 를 만든다고 했을때 

웹 브라우저로 이 파일을 열면 스왑파일과 마찬가지로 DB정보를 볼 수 있다.

 

스왑파일처럼 bak으로 시작하는 파일 접근도 막을 수 있다.

3. vi 설정 시 backup 옵션을 On 으로 설정한 경우

리눅스 vi 백업파일 : 파일명~

index.html -> index.html~

 

 

 

<Files>가 여러개 있으면 <FilesMatch>를 사용한다.

<FilesMatch 정규표현식></FilesMatch>

 

# 아래 *~ 를 FilesMath에 넣었더니 에러가 발생된다.

# 이 부분은 확인할 것!

<Files "*~">

Require all denied

</Files>

<FilesMatch "\.(sw?|bak|ht*)">

Require all denied

</FilesMatch>

[root@server2 ~]# systemctl restart httpd

 


 

실습> ErrorDocument 지시자

 

 

ErrorDocument 지시자는 기본 에러메세지를 아래 3가지 방법으로 반응할 수 있도록 하는 지시어이다.

 

=== 참고 ===

서버에 없는 파일을 요청하면(404) 아파치 웹서버는

다음 3 가지 방법으로 에러 반응 메시지를 출력한다.

 

1. 단순 에러 출력

ErrorDocument 404 "File not found!!!"

 

2. 로컬 서버로 리다이렉션(방향 전환)

ErrorDocument 404 /missing.html

지역적 URL인 /missing.html로 방향 전환하기

 

3. 리모트 서버로 리다이렉션(방향 전환)

ErrorDocument 404 http://linuxmaster.net/error.html

=== 참고 ===

 

-- 실습 순서 --

1. 단순 에러 출력 테스트

2. 로컬 서버로 리다이렉션(방향 전환) 테스트

3. 리모트 서버로 리다이렉션(방향 전환) 테스트

-- 실습 순서 --

 

1. 단순 에러 출력 테스트

없는 파일을 요청하면(404) 단순 에러 메세지를 출력하게 설정파일을 수정 한다.

서버의 설정에 따라서 403이 될 수 있으므로 아래는 403으로 설정을 처리한다.

-- httpd.conf --

ErrorDocument 403 "File not found!!!"

#ErrorDocument 404 "File not found!!!"

-- httpd.conf --

 

웹 서버 설정을 검사하고 웹서버를 재시작한다.

# httpd -t

Syntax OK

# systemctl restart httpd

 

웹 페이지에 접근해서 에러를 확인한다.

http://sbs.com/aksdfjaksfjkask.html

File not found!!!

 

2. 로컬 서버로 리다이렉션(방향 전환) 테스트

없는 파일을 요청하면 상태코드 404 가 발생된다.

html 페이지를 출력하게 설정파일을 수정 한다.

!!! IE는 파일의 크기가 512byte 가 넘어야 /error.html 페이지로 리다이렉션된다. !!!

-- httpd.conf --

ErrorDocument 403 "/error.html"

-- httpd.conf --

 

웹 서버 설정을 검사하고 웹서버를 재시작한다.

# httpd -t

Syntax OK

# systemctl restart httpd

 

에러 페이지를 작성한다.

# cd /home/sbsuser/public_html

# vi error.html

-- error.html --

<html>

<head>

<title> ::: error ::: </title>

<meta charset="utf-8">

</head>

 

<body>

<center> <font color=red> <b> File not found!!! </b> </font> </center>

</body>

</html>

-- error.html --

 

웹 페이지에 접근해서 에러를 확인한다.

http://sbs.com/abc.html

 

File not found!!!

 

3. 리모트 서버로 리다이렉션(방향 전환) 테스트

에러가 발생하면 네이버로 리다이렉션을 시켜준다.

-- httpd.conf --

ErrorDocument 403 http://linuxmaster.net/error.html

-- httpd.conf --

 

웹 서버 설정을 검사하고 웹서버를 재시작한다.

# httpd -t

Syntax OK

# systemctl restart httpd

 

 

웹 페이지에 접근해서 에러를 확인한다.

http:///sbs.com/abc.html

 

결과는 : linuxmaster.net 으로 리다이렉션된다.

 


실습 > IncludeOptional 지시어

/etc/httpd/conf.d/*.conf 를 불러들이는 지시어

 

IncludeOptional conf.d/*.conf

 


실습 > include 지시어

MPM : ??????? 

prefork 방식

자식 프로세스를 미리 fork() 해서 클라이언트를 기다리는 방식

 

worker 방식

프로세스당 여러개의 쓰레드가 연결되는 멀티 쓰레드 방식

 

 event 방식 

아파치 버전 2.4에서 추가된 기능

worker 방식을 기반으로 한다.

 


실습 > prefork 방식 

-- httpd.conf --

<IfModule prefork.c>

StartServers 50

MinSpareServers 5

MaxSpareServers 20

ServerLimit 256

MaxClients 256

MaxRequestsPerChild 4000

</IfModule>

-- httpd.conf --

 

StartServers : 자식 프로세스의 개수

MinSpareServers : 최소 프로세스의 개수

MaxSpareServers : 최대 프로세스의 개수

ServerLimit : 자식 프로세스의 제한 수 (기본값 256)

MaxClients : 클라이언트에 응답하는 개수 (기본값 256)

MaxRequestsPerChild 클라이언트의 요청 개수를 제한하는 값 (0: 무한대)

 

 

[root@server2 conf]# systemctl restart httpd

[root@server2 conf]# ps aux | grep httpd | wc -l

51


실습 > .htpasswd

 

.htpasswd의 파일을 생성할 때 -c 옵션을 주고 사용자를 생성한다.

 

두번째 사용자부터는 -c를 생략한다.


##########################

## gdb를 이용한 바이너리 분석

##########################

 

reverse engineering

 

jangpd007.tistory.com/54

 

파일을 컴파일할 때 -g 옵션을 주고 컴파일한다.

 

64bit일 경우 아래 옵션을 사용한다. (64비트 환경일때 32비트로 컴파일하는 옵션인다.)

gcc alias : alias gcc='gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack'

gdb alias : alias gdb='gdb -q'

 

# alias gcc='gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack'

# alias gdb='gdb -q'

위 옵션을 .bashrc에 넣는다.

 

 

필수

# yum -y install glibc.i686 glibc-devel.i686 libgcc.i686 libstdc++.i686

 

[root@server2 ~]# mkdir gdb

[root@server2 ~]# cd gdb

 

 

vi 설정을 해준다.

# vi /etc/vimrc

-- vi 설정 --

set nu " 번호

set ci " C언어 자동 들여쓰기

set ai " 자동 들여쓰기

set ts=4 " 탭 크기

set sw=4 " 들여쓰기, 내어쓰기 4칸

set bg=dark " 배경색

set cursorline " 커서 라인 표시

set expandtab " 탭 -> 공백으로

set fileencodings=utf8,euckr " 언어 설정

 

"##### 단축키 설정 #####

" <cr> : 엔터

" % : 현재 문서

" %< : 현재 문서에서 확장자를 버린 이름 ex) hello.c -> hello

" F1 : 도움말 (이미 정의되어 있다.)

" F2 : 파이썬 실행

" F3 : C 언어 컴파일/실행

" gcc 형식 : gcc -o 실행파일 소스파일; ./실행파일

" F4 : C++ 언어 컴파일/실행

" g++ 형식 : g++ -o 실행파일 소스파일; ./실행파일

" F5 : Java 언어 컴파일/실행

" javac 소스파일; java 클래스파일

" Hello3.java -> Hello3.class -> java Hello3

map <F2> :w<cr>:!python3 ./%<cr>

map <F3> :w<cr>:!gcc -Wall -o %< %<cr>:!./%<<cr>

map <F4> :w<cr>:!g++ -Wall -o %< %<cr>:!./%<<cr>

map <F5> :w<cr>:!javac %<cr>:!java %<<cr>

-- vi 설정 --

 

 

 

더보기

 

64bit일 경우 32bit 환경으로 컴파일하는 옵션을 아래처럼 사용한다.

gcc alias : alias gcc='gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack'

gdb alias : alias gdb='gdb -q'

 

# vi /etc/vimrc

-- vi 설정 --

set nu " 번호

set ci " C언어 자동 들여쓰기

set ai " 자동 들여쓰기

set ts=4 " 탭 크기

set sw=4 " 들여쓰기, 내어쓰기 4칸

set bg=dark " 배경색

set cursorline " 커서 라인 표시

set expandtab " 탭 -> 공백으로

set fileencodings=utf8,euckr " 파일 인코딩 언어 설정

 

"##### 단축키 설정 #####

" <cr> : 엔터

" % : 현재 문서

" %< : 현재 문서에서 확장자를 버린 이름 ex) hello.c -> hello

" F1 : 도움말 (이미 정의되어 있다.)

" F2 : C 언어 컴파일/실행

" F3 : gdb 분석

map <F2> :w<cr>:!gcc -Wall -o %< %<cr>:!./%<<cr>

map <F3> :w<cr>:!gdb %<<cr>

-- vi 설정 --

 

[root@server2 ~]# mkdir gdb

[root@server2 ~]# cd gdb

 

/*

* 파일명 : gdb1.c

* 프로그램 설명 : gdb 분석

*/

#include <stdio.h>

 

int main()

{

int i;

int j;

 

i = 1;

j = 2;

 

printf("i = %d, j = %d\n", i, j);

 

return 0;

}

 

[root@server1 gdb]# gcc -g -o gdb1 gdb1.c

[root@server1 gdb]# file gdb1

gdb1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=32cecdb87f3c67f7da4856679f65d300a887620f, not stripped

[root@server1 gdb]# ./gdb1

i = 1, j = 2

[root@server1 gdb]# yum -y install gdb

 

디스어셈블

기본값으로 실행파일을 디스어셈블할 수 있다.

형식 : disas main

 

디스어셈블

/m 옵션은 해당 소스 코드에 대한 어셈블리 코드가 보여진다.

-g 옵션을 주고 컴파일을 했기 때문에 출력된다.

형식 : disas /m main

 

디스어셈블

/r 옵션은 해당 기계어 코드가 같이 보여진다.

형식 : disas /r main

 

프로그램 실행

프로그램의 실행은 run 명령어를 이용한다.

형식 : r(run)

 

소스보기

list 명령어를 사용하면 소스코드가 10줄 단위로 출력된다.

형식 : l(list)

 

shell

외부 명령어를 실행하는 명령어

형식 : shell

 

break

break main : main 함수에 BP(break point) 를 설정함으로써 프로그램이

실행되면 main() 함수에서 멈추게 설정한다.

형식 : b(break) [함수명]

 

info

현재 설정된 브레이크포인트의 목록은 info 명령으로 확인할 수 있다.

형식 : i(info) b(break)

 

next

실행이 멈춘상태에서 다음 행을 실행한다.

형식 : n(next)

형식 : n(next) 6 //next를 6번 수행

 

메모리 조사

x 명령어를 사용해서 메모리의 내용을 출력한다.

형식 : x/[반복숫자][출력형태][크기] [메모리주소]

 

continue

끝까지 실행하기 위해서 continue 명령어를 사용한다.

형식 : c(continue)

 

[root@server1 gdb]# gdb gdb1

Reading symbols from /root/gdb/gdb1...done.

(gdb) q

 

디스어셈블

기본값으로 실행파일을 디스어셈블할 수 있다.

형식 : disas main

 

(gdb) disas main

Dump of assembler code for function main:

0x0804840d <+0>: push %ebp

0x0804840e <+1>: mov %esp,%ebp

0x08048410 <+3>: sub $0x14,%esp

0x08048413 <+6>: movl $0x1,-0x4(%ebp)

0x0804841a <+13>: movl $0x2,-0x8(%ebp)

0x08048421 <+20>: mov -0x8(%ebp),%eax

0x08048424 <+23>: mov %eax,0x8(%esp)

0x08048428 <+27>: mov -0x4(%ebp),%eax

0x0804842b <+30>: mov %eax,0x4(%esp)

0x0804842f <+34>: movl $0x80484e4,(%esp)

0x08048436 <+41>: call 0x80482e0 <printf@plt>

0x0804843b <+46>: mov $0x0,%eax

0x08048440 <+51>: leave

0x08048441 <+52>: ret

End of assembler dump.

 

디스어셈블

/m 옵션은 해당 소스 코드에 대한 어셈블리 코드가 보여진다.

-g 옵션을 주고 컴파일을 했기 때문에 출력된다.

형식 : disas /m main

(gdb) disas /m main

Dump of assembler code for function main:

8 {

0x0804840d <+0>: push %ebp

0x0804840e <+1>: mov %esp,%ebp

0x08048410 <+3>: sub $0x14,%esp

 

9 int i;

10 int j;

11

12 i = 1;

0x08048413 <+6>: movl $0x1,-0x4(%ebp)

 

13 j = 2;

0x0804841a <+13>: movl $0x2,-0x8(%ebp)

 

---Type <return> to continue, or q <return> to quit---

14

15 printf("i = %d, j = %d\n", i, j);

0x08048421 <+20>: mov -0x8(%ebp),%eax

0x08048424 <+23>: mov %eax,0x8(%esp)

0x08048428 <+27>: mov -0x4(%ebp),%eax

0x0804842b <+30>: mov %eax,0x4(%esp)

0x0804842f <+34>: movl $0x80484e4,(%esp)

0x08048436 <+41>: call 0x80482e0 <printf@plt>

 

16

17 return 0;

0x0804843b <+46>: mov $0x0,%eax

 

18 }

0x08048440 <+51>: leave

---Type <return> to continue, or q <return> to quit---

0x08048441 <+52>: ret

 

End of assembler dump.

 

디스어셈블

/r 옵션은 해당 기계어 코드가 같이 보여진다.

형식 : disas /r main

 

(gdb) disas /r main

Dump of assembler code for function main:

0x0804840d <+0>: 55 push %ebp

0x0804840e <+1>: 89 e5 mov %esp,%ebp

0x08048410 <+3>: 83 ec 14 sub $0x14,%esp

0x08048413 <+6>: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%ebp)

0x0804841a <+13>: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%ebp)

0x08048421 <+20>: 8b 45 f8 mov -0x8(%ebp),%eax

0x08048424 <+23>: 89 44 24 08 mov %eax,0x8(%esp)

0x08048428 <+27>: 8b 45 fc mov -0x4(%ebp),%eax

0x0804842b <+30>: 89 44 24 04 mov %eax,0x4(%esp)

0x0804842f <+34>: c7 04 24 e4 84 04 08 movl $0x80484e4,(%esp)

0x08048436 <+41>: e8 a5 fe ff ff call 0x80482e0 <printf@plt>

0x0804843b <+46>: b8 00 00 00 00 mov $0x0,%eax

0x08048440 <+51>: c9 leave

0x08048441 <+52>: c3 ret

---Type <return> to continue, or q <return> to quit---

End of assembler dump.

 

 

프로그램 실행

프로그램의 실행은 run 명령어를 이용한다.

형식 : r(run)

 

(gdb) run

Starting program: /root/gdb/gdb1

i = 1, j = 2

[Inferior 1 (process 104041) exited normally]

Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.i686

(gdb) r

Starting program: /root/gdb/gdb1

i = 1, j = 2

[Inferior 1 (process 104047) exited normally]

 

소스보기

list 명령어를 사용하면 소스코드가 10줄 단위로 출력된다.

형식 : l(list)

 

(gdb) list

3 * 프로그램 설명 : gdb 분석

4 */

5 #include <stdio.h>

6

7 int main()

8 {

9 int i;

10 int j;

11

12 i = 1;

(gdb)

13 j = 2;

14

15 printf("i = %d, j = %d\n", i, j);

16

17 return 0;

18 }

 

1번 라인부터 20번 라인까지 출력한다.

(gdb) list 1, 20

1 /*

2 * 파일명 : gdb1.c

3 * 프로그램 설명 : gdb 분석

4 */

5 #include <stdio.h>

6

7 int main()

8 {

9 int i;

10 int j;

11

12 i = 1;

13 j = 2;

14

15 printf("i = %d, j = %d\n", i, j);

16

17 return 0;

18 }

 

shell

외부 명령어를 실행하는 명령어

형식 : shell

 

(gdb) shell

[root@server1 gdb]# exit

exit

(gdb) she ls

gdb1 gdb1.c

(gdb) she pwd

/root/gdb

 

break

break main : main 함수에 BP(break point) 를 설정함으로써 프로그램이

실행되면 main() 함수에서 멈추게 설정한다.

형식 : b(break) [함수명]

 

(gdb) b main

Breakpoint 1 at 0x8048413: file gdb1.c, line 12.

 

info

현재 설정된 브레이크포인트의 목록은 info 명령으로 확인할 수 있다.

형식 : i(info) b(break)

(gdb) i b

Num Type Disp Enb Address What

1 breakpoint keep y 0x08048413 in main at gdb1.c:12

 

next

실행이 멈춘상태에서 다음 행을 실행한다.

형식 : n(next)

형식 : n(next) 6 //next를 6번 수행

 

(gdb) r

Starting program: /root/gdb/gdb1

 

Breakpoint 1, main () at gdb1.c:12

12 i = 1;

(gdb) p i

$1 = 0

(gdb) n

13 j = 2;

(gdb) p i

$2 = 1

(gdb) p j

$3 = 134513744

(gdb) n

15 printf("i = %d, j = %d\n", i, j);

(gdb) p j

$4 = 2

(gdb) p i

$5 = 1

(gdb) p j

$6 = 2

(gdb) n

i = 1, j = 2

17 return 0;

(gdb) n

18 }

(gdb) n

0xf7e202d3 in __libc_start_main () from /lib/libc.so.6

(gdb) n

Single stepping until exit from function __libc_start_main,

which has no line number information.

[Inferior 1 (process 105781) exited normally]

 

메모리 조사

x 명령어를 사용해서 메모리의 내용을 출력한다.

형식 : x/[반복숫자][출력형태][크기] [메모리주소]

출력형태 : o(octal), x(hex), d(decimal), u(unsigned decimal),

t(binary), f(float), a(address), i(instruction), c(char) and s(string)

크기 : b(byte), h(halfword, 16 bytes), w(word, 32 bytes), g(giant, 8 bytes).

 

(gdb) x/16xw $ebp

(gdb) x/16xw $ebp-16

(gdb) x/s $ebp-16

(gdb) x/s 0x80484b0

 

(gdb) r

Starting program: /root/gdb/gdb1

 

Breakpoint 1, main () at gdb1.c:12

12 i = 1;

(gdb) n

13 j = 2;

(gdb) n

15 printf("i = %d, j = %d\n", i, j);

(gdb) p &i

$8 = (int *) 0xffffd6f4

(gdb) x/1xw 0xffffd6f4

0xffffd6f4: 0x00000001

(gdb) p &j

$9 = (int *) 0xffffd6f0

(gdb) x/1xw 0xffffd6f0

0xffffd6f0: 0x00000002

 

continue:

끝까지 실행하기 위해서 continue 명령어를 사용한다.

형식 : c(continue)

(gdb) c

Continuing.

i = 1, j = 2

[Inferior 1 (process 106162) exited normally]

(gdb) q

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'정보보안(시스템,네트워크) > 리눅스' 카테고리의 다른 글

DAY_35 DNS 도메인 설정  (0) 2021.02.15
DAY_34 MPM, Nginx  (0) 2021.02.10
DAY_32 apache  (0) 2021.02.08
DAY_31 두번째 DB연결해주기  (0) 2021.02.05
DAY_30 서버 교체해보기  (0) 2021.02.04

BELATED ARTICLES

more