BLOG main image
분류 전체보기 (222)
Reversing (13)
Pwnable (4)
Linux Kernel (3)
Crypto (2)
Wargames (66)
Programming (18)
Write Up (32)
Project (22)
Web (2)
My Life (52)
Memo (3)
etc (2)
발표자료 (1)
36,063 Visitors up to today!
Today 12 hit, Yesterday 30 hit
daisy rss
tistory 티스토리 가입하기!
2017.10.31 23:04


일기 짱 오랜만이다. 일기 썼던 사실도 까먹고 있다가 어쩌다가 다시쓴당

일년 반 좀 넘게만에 쓰는데 그동안 많은 일이 있었다. 대회에서 상도 몇 번 타고 비오비 5기도 수료하고 학교도 그럭저럭 잘 다니고 있다.

이제 수능 16일 전이라 애들 다 하루종일 도서관 올라가 있고 나는 하루종일 그린아이티에서 지낸다. 컴퓨터 자유롭게 쓰는건 좋은데 요즘 잠이 너무 많이 온다.

문제를 풀다가 풀 방법이 보이지가 않으면 자꾸 잠이 오게 된다. 근데 자고 일어나면 조금씩 문제가 풀린당 근데 잠자는 시간은 좀 아깝다ㅜㅜ

오늘 드디어 w3challs.com에 wargame 카테고리의 x86 - convert 문제를 풀었다.

포맷스트링 문제였는데 푸는데 한 일주일 걸린거 같다. 처음에는 풀 방법이 안보였는데 삽질하다 보니까 풀렸다.

w3challs 문제들 짱 좋은거 같다. 리버싱이랑 포너블은, 근데 좀 어렵다.

icg ctf 1등 했던거 상금 오늘 들어왔다. 0.03974485 BTC만큼 줬다. 30만원 좀 안되는데 비트코인 거래 처음 해봐서 짱 신기하다.

그리고 이게 가격이 유동적으로 변하는거도 신기하다. 아까 받을 때는 27만원이었는데 지금 보니까 28만원으로 올랐다. 가격 올라갔다 내려갔다 하는거 중간중간 보는 재미가 쏠쏠하당

그냥저냥 헛되게 보내는 시간이 요즘 꽤 되는거 같은데 이런거 없애야 할거같다. 잠 좀 자지 말장

의식의 흐름대로 써봤다. 매일매일 쓸 수 있도록 노력해야겠다.

'My Life > Diary' 카테고리의 다른 글

2017년 12월 26일 화요일  (2) 2017.12.26
2017년 10월 31일 화요일  (2) 2017.10.31
2016년 3월 25일 금요일  (2) 2016.03.26
2016년 2월 21일 일요일  (3) 2016.02.21
2016년 2월 15일 월요일  (2) 2016.02.15
2016년 2월 12일 금요일  (4) 2016.02.13
song___99 | 2017.11.21 21:23 신고 | PERMALINK | EDIT/DEL | REPLY
왜 까먹으셨나요? 반성하시길ㅎㅎㅎㅋㅎㅎㅎㅎㅎㅋㅎ
5unKn0wn | 2017.11.21 21:51 신고 | PERMALINK | EDIT/DEL
앞으로는 안까먹게 자주자주 알려주세여ㅠㅠㅠ
Name
Password
Homepage
Secret
2017.08.29 14:16


두 값을 더하는 add연산을 하는 함수를 만들어야 한다는 상황을 가정해보자

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
#include <iostream>
 
/*
int add(int a, int b) {
    return a + b;
}
double add(double a, double b) {
    return a + b;
}
std::string add(std::string a, std::string b) {
    return a + b;
}
*/
 
template <typename T>
T add(T a, T b) {
    return a + b;
}
 
// 특수화 (Specialization)
template <typename T>
int add(int* a, int* b) {
    return *+ *b;
}
 
int main(void) {
    int a = 10, b = 20;
    double c = 10.4, d = 20.4;
    std::string s = "Hello", t = "World";
    int* pA = &a;
    int* pB = &b;
 
    int sum = add(a, b);
    double sum2 = add(c, d);
    std::string sum3 = add(s, t);
    int pSum = add<int*>(pA, pB);    // using specialization template
 
    std::cout << pSum << std::endl;
}
cs

템플릿이 없었다면 주석처럼 각 타입마다 모두 add함수를 만들어서 사용해야 할 것이다.
그런데 템플릿을 사용하면 이렇게 타입에 대해서 T로 표시하고 어찌어찌 해서 들어오는 타입대로 더할 수 있게 된다.
특정 자료형만 따로 정의할 일이 있으면 위에처럼 특수화를 해서 정의하면 된다.

그럼 int와 double은 어떻게 더해야 하는가? 
int + double은 double이지만 어떤 값이 double인지 알아내기는 쉽지 않다.
여러가지 대처 방법이 있을 수 있는데 가장 무난하고 권장되는 방법은

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template <typename T1, typename T2>
auto add(T1 a, T2 b) -> decltype(a + b) {
    return a + b;
}
 
int main(void) {
    auto e = 10.4f;
    decltype(e) f = 24.5f;    // e의 타입으로 정의
 
    int a = 10;
    double b = 20.4;
 
    std::cout << add(a, b) << std::endl;
    std::cout << add(b, a) << std::endl;
}
cs

이렇게 auto로 반환하되 auto의 타입을 decltype을 이용해서 a + b의 타입으로 맞춰주면 된다.

다음은 가변인자에 대한 가변 템플릿이다.

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
#include <iostream>
 
/*
int sum(int a, int b) {
    return a + b;
}
int sum(int a, int b, int c) {
    return a + b + c;
}
int sum(int a, int b, int c, int d) {
    return a + b + c + d;
}
int sum(int a, int b, int c, int d, int e) {
    return a + b + c + d + e;
}
// ...
*/
 
// C++11 : Variadic Template (가변 템플릿)
template <typename T, typename... Args>
T sum(T a, Args... args) {
    return a + sum(args...);
}
 
template <typename T>
T sum(T a) {
    return a;
}
 
int main(void) {
    int a = 1, b = 2, c = 3;
 
    std::cout << sum(a, b) << std::endl;
    std::cout << sum(a, b, c) << std::endl;
}
cs

가변 템플릿이 없었다면 주석에 있는 것처럼 모든 인자의 개수에 맞춰서 다 정의를 미리 해주어야한다.
그런데 가변 템플릿을 사용하면 그럴 필요가 없다.

가변 템플릿은 재귀적인 형태로 이루어지며 가변 인수를 받는 템플릿 함수와 재귀적으로 돌다가 인자가 하나만 남았을 때 처리하는 함수 총 두개가 필요하다.

가변 템플릿은 위에 처럼 쓰면 댄다.
그리고 저 가변 템플릿은 코드상에서는 재귀지만 컴파일 타임때 재귀는 모두 풀리고 그냥 함수로 풀려서 실제 컴파일 하면 재귀로 실행되지 않는다.
그래서 재귀함수의 오버헤드가 발생하지 않는다.

그럼 가변 템플릿과 이것 저것을 응용해서 

1
2
3
4
5
6
#include <iostream>
 
int main(void) {
    std::cout << 'a' << 3 << "String" << 3.14 << std::endl;
    PrintList('a'3"String"3.14);
}
cs

4번 라인과 5번 라인이 똑같이 나오도록 PrintList함수를 만들어보자.

물론 인자 개수와 타입은 각각 바뀔 수 있다.

알아서 만들자

'Programming > C++' 카테고리의 다른 글

C++에서 문자열 EOF까지 입력받고 출력하기  (0) 2018.04.24
c++ 템플릿 공부  (0) 2017.08.29
Lvalue와 Rvalue  (0) 2017.05.20
Name
Password
Homepage
Secret
2017.08.13 00:43


따로 ida에서 제공하는 dbgsrv에서 쓸만한게 없다면 gdbserver를 올려서 디버깅 해야한다.
서버에 gdbserver를 static으로 서버 환경에 맞게 컴파일하거나 이미 컴파일 된 파일을 다운 받아서 올리고 

"sudo ./gdbserver 127.0.0.1:port ./binary" 이렇게 실행하면 된다. port부분에 1337, 7777처럼 포트 번호를 넣으면 된다. (해당 포트포워딩은 외부로 해 둬야 한다.)

가끔씩 sudo를 안해서 ida에서 오류가 날 때가 있으니 해주는게 좋다.

그리고 ida로 debugger를 Remote GDB debbuger로 설정하고 Debugger - Process Options에서 Application, Input file을 서버에서의 파일 위치로 잡고, Parameters는 인자, Hostname에 서버 주소를, Port에 아까 열은 포트를 입력하면 된다.

그러면 디버깅을 할 수 있다.

그런데 가끔씩

이런 에러가 날 때가 있다. ("Single-stepping a thread failed; possibly stub does not support single-stepping Try disabling the single-step functionality in debugger-specific options.")

이 때는 Debugger - Debugger Options - Set specific options - Use stepping support 옵션에 체크를 해제해주면 정상적으로 디버깅 할 수 있다.

'Reversing > Debugging Tech' 카테고리의 다른 글

gdbserver 디버깅  (0) 2017.08.13
OS 동적 디버깅(vmware)  (1) 2016.06.22
16bit DOS Debugging  (0) 2016.02.03
IDA Linux Remote Debugging  (0) 2015.09.19
Name
Password
Homepage
Secret